2009-04-17 81 views
1

我用posix_spawnp来执行不同的流程,我检查状态(与waitpid函数),以确保孩子正确创建催生孩子状态退出= 127

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

我在这里做错了什么?

回答

1

检查this link

例如:

EINVAL通过file_actions或attrp指定的值是无效的。

为的posix_spawn和posix_spawnp子程序的错误代码是受以下条件: 如果以后调用进程成功地从的posix_spawn或posix_spawnp函数返回出现此错误,子进程可能会退出状态退出127

它看起来好像它可能与127退出的原因有一大堆。

+0

我重新写使用叉子和execvp获得错误的更明确的把握代码和事实证明,实际的错误信息是: 错误号= 14(无效地址) 一些周围挖透露,这是因为我没结束我的参数列表最后一项为“NULL”。 argv = new char [iSize + 1]; argv [iSize] = NULL; 修复了这个问题。 – Gayan 2009-04-20 03:56:20

0

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

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

+0

的waitpid函数调用返回的值> 0,这意味着有一个有效的孩子。 – Gayan 2009-04-17 08:13:14