어떤 경우에는 Sigchld를 무시하지만 다른 경우에는 없습니다

StackOverflow https://stackoverflow.com/questions/631641

  •  08-07-2019
  •  | 
  •  

문제

내 프로그램에서는 사용자 입력에 따라 여러 번 Fork ()를 여러 번 포크합니다.

어떤 경우에는 Sigchld를 처리하고 "프로세스 # 완료"와 같은 것을 말하고 싶습니다. 그러나 다른 경우에는이 신호를 무시하고 싶습니다.

어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

신호 처리는 프로세스를 위해 전 세계적으로 설정됩니다. 일부 어린이가 다른 어린이가 끝나지 않을 때 Sigchld와 같은 비동기 신호를 잡으려면 미리 무시하기로 결정할 수 없습니다.

부모 내에서 매번 신호를 처리 한 다음 핸들러에서 신호를 무시할 것인지 결정해야합니다.

최소한 핸들러는 아이에 대한 대기 ()를 수행하여 (SIGINFO_T 구조의 SI_PID) 반환 코드를 수확해야합니다. 이 시점에서 프로세스 ID를 확인하고 다른 일을 결정할 수 있습니다. 원하지 않는다면 아무것도 인쇄 할 필요가 없습니다.

다른 팁

Signal Sigchld를 잡은 다음 함수를 호출하려고합니다. 당신은 사용하고 싶습니다 signal() 이것을하기 위해 (man signal). 아래 예에서 child_died() 신호 Sigchld가 잡힌 후 호출됩니다 (이 시점에서 아동 프로세스가 죽었습니다). 자녀에서 부모에게 전달 해야하는 정보가있는 경우 child_died() 조건부에 필요한 경우 파이프를 사용해야합니다 (man pipe). 다음은 신호 및 파이프의 예입니다.

#include <signal.h>
#include <strings.h>
#include <stdio.h>

#define MAX_SIZE 256

void child_died(int);

int fd[2];

int main()
{
    int pid;
    extern int fd[];
    char *str;

    pipe(fd);
    signal(SIGCHLD, child_died);

    if ((pid = fork()) < 0) {
        // error
        printf("Error\n");
    } else if (pid == 0) {
        // child
        printf("In child process\n");
        close(fd[0]);
        str = strdup("Message from child process.\n");
        write(fd[1], str, strlen(str) + 1);
    } else {
        // parent
        wait();
        printf("Now in parent\n");
    }

    return 0;
}

void child_died(int s)
{
    char *str;
    close(fd[1]);
    read(fd[0], str, MAX_SIZE);
    printf("%s", str);
}

sigchld.c로 저장하고 다음과 함께 편집했습니다. gcc -Wall sigchld.c -o sigchld

int (어린이 PID와 같은) 또는 자식 프로세스에서 부모 프로세스로 다른 데이터 유형을 전달하려면 문자열로 다시 변환하고 다시 할 수있는 다른 방법을 찾아야합니다.

Sigchld를 무시하고 싶다면 내 예에서는 그 논리를 넣을 것입니다. child_died(). 간단한 것을 사용하십시오 if. 신호를 무시할시기와 원하는 것을 인쇄 할시기를 어떻게 결정하는지 모르겠습니다. 그래서 위의 코드에 파이프 물건을 포함 시켰습니다. 나는 당신이 아동 과정에서 어떤 정보를 사용할 것이라고 생각했고 그 이후로 child_died() 부모 프로세스에서 호출되며 자녀에서 부모 프로세스로 데이터를 전송하는 방법이 필요합니다.

이게 도움이 되길 바란다. 내가 알지 못하는이를 달성하는 더 나은 방법이있을 수 있습니다. 그렇다면 의견을 제시하십시오.

당신이 사용할 수있는 waitpid 주어진 자식의 신호를 기다린 다음 처리를 수행하기 위해 차단 또는 비 블로킹 모드에서 기능합니다. 사실, 당신 가지다 사용 wait 그레이엄의 대답에 언급 된 바와 같이 일종의 일종의 ...

Sigchld를 무시하면 프로세스 테이블이 좀비로 채워집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top