我使用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循环中,但它不会正确生成。 如果我重新启动父进程,它会工作一段时间,但同样的问题会在一段时间后再次出现。
我在这里做错了什么?
答案 0 :(得分:1)
检查this link。
例如:
EINVAL file_actions或attrp指定的值无效。
posix_spawn和posix_spawnp子例程的错误代码受以下条件的影响: 如果在调用进程从posix_spawn或posix_spawnp函数成功返回后发生此错误,子进程可能会以退出状态127退出。
由于各种原因,它似乎可能会以127退出。
答案 1 :(得分:0)
检查waitpid()
的返回代码,确保它没有问题。
代码读取的方式表明您一次只生成一个子进程(否则无需在循环中调用waitpid()
)。但是在这种情况下,我不希望使用WNOHANG
。