2014-11-12 1 views
0

그래서, 내가하려고하는 것은 자식 프로세스를 생성하고 execl을 실행하고 ls를 실행하는 것이다. 그런 다음 ls가 완료되면 다른 하위 프로세스를 작성하고 파일에 cat 명령을 실행하게하십시오. 두 번째 대기 (pid)는 완료되기 전에 두 번째 하위 프로세스가 완료되기를 기다리는 것 같지 않습니다. 여기에 내 코드와 출력부모 프로세스가 두 번째 대기하지 않는 이유는 무엇입니까? C/Unix

#include <fcntl.h> 

int main(){ 
int pid; 
printf("In parent process, creating child now...\n"); 
pid = fork(); 
if (pid==0){ 
printf("Now in child process...\n"); 
execl("/bin/ls","ls","-l",(char*)0); 
} 
wait(pid); 
printf("ls child process complete\n"); 
printf("in parent process\n"); 
printf("Creating another child process\n"); 
pid=fork(); 
if(pid==0){ 
    execl("/bin/cat","cat","f1",(char*)0); 
} 
wait(pid); 
return 0; 

} 

것은 여기 내 출력

In parent process, creating child now... 
Now in child process... 
"Contents of ls" 
ls child process complete 
in parent process 
creating another child process 
[[email protected] ~]$ "Contents of file" *cursor* 

부모 프로세스가 두 번째 아이가 완료되기 전에 완료하는 것입니다. 한 번에 한 명의 자녀 만 존재합니다. "파일 내용"은 [username @ host ~] $ 프롬프트 앞에 나타납니다. 나는 내가 기다리거나 잘못 된 약물 할당을 잘못하고 있다고 생각한다. 미리 감사드립니다!

+0

예를 재현 할 수 없습니다. 적절한 헤더를 추가 한 후 코드가 잘 실행되는 것 같습니다. – merlin2011

+0

때로는 실제로 실제로 제대로 인쇄되지만 대부분의 경우 인쇄되지 않습니다. – JohnnyBoy

답변

3

wait()의 인수는 PID가 아닙니다. 종료 상태가 저장 될 int에 대한 포인터입니다.

  1. 프로그램은 바로이 wait 전화로 손상된 일부 관련이없는 메모리 위치를 충돌하거나 수 있습니다 당신은 의미 포인터가 필요한 정수를 전달하고 있습니다. 그 시점 이후의 행동은 예측할 수 없습니다.
  2. 더 많은 컴파일러 경고를 사용하고주의를 기울여야합니다.
+0

아, 맞습니다. 저는 wait ((int *) 0)를 사용해야했습니다. 고마워요, 모든 것이 수정되었습니다. BTW, 유닉스에서 gcc 컴파일러를 사용하고 있는데, 어떻게 이러한 경고를 활성화 할 수 있습니까? – JohnnyBoy

+1

처음에는'gcc -Wall yourprog.c'를 실행하십시오. –

0

Cat 프로세스가 완료되었을 수 있지만 디스크 캐시는 여전히 결과를 보유하고있을 수 있습니다 ... 파일을 잠그기 위해 대기 할 때까지 기다리는 대신 cat이 대기합니다.

관련 문제