프로그램 내에서 다른 fork() 함수로 생성 된 하위 프로세스를 구분할 수있는 방법이 있습니까?fork() 내의 fork()
global variable i;
SIGCHLD handler function()
{
i--;
}
handle()
{
fork() --> FORK2
}
main()
{
while(1)
{
if(i<5)
{
i++;
if((fpid=fork())==0) --> FORK1
handle()
else (fpid>0)
.....
}
}
}
FORK1 및 FORK2에 의해 생성 된 하위 프로세스를 구별 할 수있는 방법이 있습니까? 왜냐하면 SIGCHLD 핸들러 함수에서 전역 변수 'i'의 값을 감소시키고 FORK1에 의해 생성 된 프로세스에 대해서만 감소시켜야하기 때문입니다.
배열을 사용하고 자식 프로세스 ID를 저장하려고했습니다. FORK1에서 작성한 프로세스이며 상위 프로세스에서 수행합니다. 죽은 아이의 프로세스 ID 배열 내에있는 경우 내가 '난'단지의 값을 감소시킵니다 ...
하지만 다음과 같은 시나리오
자식 1, 상위 1에 문제에 직면, 자식 1은 사망 제대로 업데이트되는 배열을 상위 1 후 살해되기 때문에는, 자식 2는 자식 2는
Incase의 자식 1의 parent2, 죽였다.
하지만 child2의 경우 pid 값이 parent2에 의해 배열에서 업데이트되기 전에 어떤 결과가 발생합니까? 자식 2 PID 값이 배열에 없으므로 SIGCHLD 신호 처리기 함수 내부에서 'i'값이 그에 따라 감소하지 않습니다.
그래서이 문제에 대한 더 나은 해결책이 있습니까 ??
가능한 복제본 : http://stackoverflow.com/questions/340283/avoiding-a-fork-sigchld-race-condition – jschmier
흠 ... 실제로 나는 그것을 이전에 발견하지 못했습니다 .. – codingfreak
어떻게 신호 처리기를 설정하고 있습니까? ? 'signal','bsd_signal' 또는'sigaction'을 사용합니까? – Random832