1

我使用 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 循环中,但它不会正确生成。如果我重新启动父进程,它会工作一段时间,但同样的问题会在一段时间后再次出现。

我在这里做错了什么?

4

2 回答 2

1

检查此链接

例如:

EINVAL file_actions 或 attrp 指定的值无效。

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

出于多种原因,它看起来可能会以 127 退出。

于 2009-04-17T12:28:52.063 回答
0

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

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

于 2009-04-17T07:53:52.100 回答