문제

나는 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.

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