출력을 파일로 재지 정해야하는 쉘에 함수를 작성하고 있습니다. 예를 들어 사용자 쓰기 : ls -l >> file
및 ls -l
은 파일에 기록해야합니다. 거의 모든 것이 정확하지만 처음에는 함수 프로그램을 중지 한 후에 다른 것을 쓸 수 없습니다. 내 기능을 제시하고 내가 문제를 해결하기 위해 어떤 단서를 부탁드립니다 아래 :dup2 이후 사용자 정의 쉘이 작동을 멈춤
void execute2(char *command, char **argv, char **argv2)
{
pid_t pid;
int status;
if ((pid = fork()) < 0)
{
printf("*** ERROR ***\n");
exit(1);
}
else if (pid == 0)
{
close(1);
parse(command, argv, argv2);
int output = open(*argv2, O_APPEND | O_WRONLY);
dup2(output,1);
if (strcmp(argv[0], "exit") == 0)
exit(0);
if (execvp(*argv, argv) < 0)
{
printf("*** ERROR ***\n");
exit(1);
}
close(output);
}
else
{
while (wait(&status) != pid);
}
}
command
은 사용자로부터 얻는 명령은 argv
이 명령 및 매개 변수와 argv2
출력 파일이의 일부입니다.
'dup2 (출력, 1)'다음에'execvp()'- 바람직하게는'strcmp()'이전에'close (출력) '해야합니다. 'execvp()'에서 리턴 값을 테스트 할 필요가 없습니다. 그것은 실패 할 경우에만 리턴합니다. –
아이가 어떻게 든 죽어 가고 싶지 않다면 대기 루프가 영원히 돌아 간다. 디버깅을 위해 프로세스 ID 및 상태를 캡처하고 인쇄하십시오. 견고성; 'int corpse;를 사용하십시오. int 상태; while ((시체 = 대기 (& 상태))! = -1 & 시체! = pid) printf ("자식 % d는 상태 0x.4X로 종료되었습니다 \ n", 시체, 상태); 이것조차 완벽하지는 않습니다. 그것은'errno == EINTR'으로'-e '를 처리하고'wait()'를 리턴 할 가능성을 무시한다. 최소한이 방법으로, 당신은 무슨 일이 일어나는지 알게 될 것입니다. –
어떤 명령을 부릅니까? 'ls'를 호출하면, 이것이 반환되어야하는 것처럼 보입니다. 'cat'이나 stdin으로부터의 읽기를 막을 다른 것을 호출한다면, 여러분은 그것이 신호를 보낼 때까지 실행될 것이라고 기대할 것입니다. –