스폰 된 아이는 상태 = 127로 나가는 것입니다
문제
나는 posix_spawnp를 사용하여 다른 프로세스를 실행하고 (Waitpid와 함께) 상태를 확인하여 아이가 올바르게 생성되었는지 확인합니다.
int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);
if (iRet != 0)
{
return false;
}
int iState;
waitpid(static_cast<pid_t>(iPID), &iState, WNOHANG);
cout << "Wait: PID " << iPID << " | State " << iState << endl;
if (WIFEXITED(iState)) {
printf("Child exited with RC=%d\n",WEXITSTATUS(iState));
}
else if (WIFSIGNALED(iState)) {
printf("Child exited via signal %d\n",WTERMSIG(iState));
}
else
{
printf("Child is NORMAL");
}
처음에 이것은 올바르게 실행되며 다음과 같은 메시지를받습니다.
대기 : PID 15911 | 상태 0 자녀는 RC = 0으로 빠져 나옵니다
동일한 프로세스를 여러 번 실행 한 후, 하위 프로세스는 상태 127로 종료되기 시작합니다.
대기 : PID 15947 | State 32512 어린이는 RC = 127로 빠져 나갔습니다
이런 일이 발생하면 아이가 다시 스폰 할 수 없었습니다. 위에 주어진 코드 섹션을 For Loop에서 동봉했지만 제대로 생성되지는 않습니다. 부모 프로세스를 다시 시작하면 잠시 동안 작동하지만 동일한 문제가 잠시 후에 다시 발생합니다.
여기서 내가 뭘 잘못하고 있니?
해결책
확인하다 이 링크.
예를 들어:
einval file_actions 또는 attp로 지정된 값은 유효하지 않습니다.
posix_spawn 및 posix_spawnp 서브 루틴의 오류 코드는 다음 조건의 영향을받습니다.이 오류는 호출 프로세스가 posix_spawn 또는 posix_spawnp 함수에서 성공적으로 반환 된 후에이 오류가 발생하면 자식 프로세스가 종료 상태 127로 종료 될 수 있습니다.
마치 여러 가지 이유로 127로 나갈 수있는 것처럼 보입니다.
다른 팁
리턴 코드를 확인하십시오 waitpid()
문제가되지 않도록합니다.
코드가 읽는 방식은 한 번에 한 자녀 프로세스 만 스폰하고 있음을 시사합니다 (그렇지 않으면 전화 할 필요가 없습니다. waitpid()
루프 내에서). 그러나이 경우 나는 사용하기를 기대하지 않을 것입니다 WNOHANG
.