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

我在这里做错了什么?

有帮助吗?

解决方案

查看 这个链接.

例如:

EINVAL file_actions 或 attrp 指定的值无效。

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

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

其他提示

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

该代码读取的方式表明,你只是在一个时间产卵一个子进程(否则会是无需调用内环路waitpid())。然而,在这种情况下,我不希望使用WNOHANG

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top