产卵的孩子退出州= 127

时间:2009-04-17 07:27:04

标签: c++ spawn waitpid

我使用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 |国家32512儿童   退出RC = 127

发生这种情况后,我无法让孩子再次产卵。我将上面给出的代码部分包含在for循环中,但它不会正确生成。 如果我重新启动父进程,它会工作一段时间,但同样的问题会在一段时间后再次出现。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

检查this link

例如:

  

EINVAL file_actions或attrp指定的值无效。

     

posix_spawn和posix_spawnp子例程的错误代码受以下条件的影响:   如果在调用进程从posix_spawn或posix_spawnp函数成功返回后发生此错误,子进程可能会以退出状态127退出。

由于各种原因,它似乎可能会以127退出。

答案 1 :(得分:0)

检查waitpid()的返回代码,确保它没有问题。

代码读取的方式表明您一次只生成一个子进程(否则无需在循环中调用waitpid())。但是在这种情况下,我不希望使用WNOHANG