题
我使用 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
。
不隶属于 StackOverflow