
함수 사용 시 아래와 같이 wait
예제 1.1 실행 시 SIGCHLD
신호가 소모됩니다 .wait
샘플 1.1
if (pid==0){
printf("child\n");
printf("%d\n",pid);
}
else{
printf("Parent\n");
printf("%d\n",pid);
wait(NULL);
sleep (10);
}
이 함수가 생략된 예제 1.2(아래)를 실행하면 wait
하위 프로세스가 실패합니다. wait
함수가 신호를 처리하는 이유는 무엇 입니까 SIGCHLD
?
예제 1.2
if (pid==0){
printf("child\n");
printf("%d\n",pid);
}
else{
printf("Parent\n");
printf("%d\n",pid);
sleep (10);
}
답변1
귀하의 2개 샘플을 읽을 수는 있지만 귀하의 질문은 거의 의미가 없습니다.
POSIX/Single Unix 사양 버전 4, 2018 에디션에 따르면, 프로세스가 자식 프로세스의 상태를 무시하고 싶다는 것을 시스템에 명시적으로 나타내지 않는 경우:
상태 정보(종료 상태 코드 등)가 생성되어야 합니다.
[Exit] 프로세스는 좀비 프로세스로 바뀌어야 합니다. ...
상위 프로세스가 프로세스의 상태 정보를 얻으면 프로세스의 수명 주기가 종료됩니다.
프로세스가 종료되기를 기다리는 동안 wait(), waitid() 또는 waitpid()를 호출하는 동안 호출 프로세스의 상위 프로세스에 있는 하나 이상의 스레드가 차단되면 그 중 하나(또는 있는 경우)가 waitid를 호출하는 것입니다. () WNOWAIT 포함, 가능하면 그 이상) 이 스레드는 [종료된] 프로세스의 상태 정보를 가져와서 차단을 해제해야 합니다.
SIGCHLD는 상위 프로세스로 전송되어야 합니다.
마지막 사항에 유의하십시오 - SIGCHLD
항상 생성하십시오(부모가 이를 무시하도록 지정하지 않는 한)!
고쳐 쓰다
나는 당신의 프로그램 스니펫 중 두 개를 테스트했는데, 내 생각에는 타당하다고 생각됩니다. 둘 다 성공적으로 실행됩니다. 다음은 2개의 완전한 프로그램 소스 코드와 터미널 출력입니다.
전체 예제 1.1:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if( pid == 0 ) {
printf("child\n");
printf("%d\n", pid);
}
else {
printf("Parent\n");
printf("%d\n", pid);
wait(NULL);
sleep(10);
}
}
전체 예제 1.2:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if( pid == 0 ) {
printf("child\n");
printf("%d\n", pid);
}
else {
printf("Parent\n");
printf("%d\n", pid);
sleep(10);
}
}
//64-bit Mac Mini./
$ make s1 s2 ; ./s1 ; ./s2
make: `s1' is up to date.
make: `s2' is up to date.
Parent
46431
child
0
Parent
46449
child
0
//64-bit Mac Mini./
$