샘플 1.1

샘플 1.1

함수 사용 시 아래와 같이 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./
$

관련 정보