문제

보통 C에서 포크해야 할 때 다음과 같은 일을합니다.

pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }

추가 변수를 버리고 사용할 수있는 것은 나에게 일어났다.

if(fork() == 0) { /* child */ }
else { /* parent/pray */ }

부적절한 오류 처리를 제쳐두고 (왜) 작동하거나 작동하지 않습니까?

도움이 되었습니까?

해결책

당신이 제안하는 것은 확실히 효과가있을 것입니다. 그러나 잘 행동 한 응용 프로그램에서 오류 처리는 선택 사항이 아닙니다. 다음 구현 패턴은 비슷하게 간결하고 오류를 처리합니다. 또한 PID 변수에 포크 () 반환 값을 저장합니다. 부모님의 나중에 사용하여 자녀를 기다릴 수 있습니다.

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}

다른 팁

부모의 자녀 프로세스 ID를 잃습니다. 부모에게 반환됩니다. 나는 당신이 그 정보를 복구 할 수 있다고 생각하지만 아마도 독특하지는 않을 것입니다 (즉, 모든 자녀의 PID를 얻을 수는 있지만 반드시 당신이 방금 포기 한 아이의 PID는 아닙니다). 아이의 PID를 알 필요가 없다면 두 번째 방법은 괜찮다고 생각합니다.

또한 포킹에 오류가 있으면 -1이 반환됩니다. 두 경우 모두 테스트하지 않는 이는 일반적으로 실수입니다.

대신 이것을해야합니다. 나는 그것이 작동하지 않는다는 것을 결코 알지 못했습니다. Stevens Books에서 수행되는 방식입니다.

int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }

당신은 C에서 자유롭게 할 수 있으며 부모와 자식은 포크에서 다른 반환 값을 받기 때문에 작동합니다. 먼저 평가됩니다. 유일한 문제는 언급했듯이 오류 처리입니다. 또한, 당신은 waitpid 등과 같이 수술을 원할 경우 아이 PID를 복구 할 수있는 다른 방법이 없습니다.

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