【问题标题】:Spawned child exits with state = 127生成的子退出状态 = 127
【发布时间】:2009-04-17 07:27:03
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

    标签: c++ spawn waitpid


    【解决方案1】:

    检查this link

    例如:

    EINVAL file_actions 或 attrp 指定的值无效。

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

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

    【讨论】:

    • 我使用 fork 和 execvp 重新编写了代码以更明确地掌握错误,结果发现实际的错误信息是:errno = 14 (bad address) 一些挖掘发现这是因为我没有以“NULL”的最终条目结束我的参数列表。 argv = 新字符 [iSize + 1]; argv[iSize] = NULL;解决了问题。
    【解决方案2】:

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

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

    【讨论】:

    • waitpid 调用返回值 > 0,这意味着有一个有效的孩子。
    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2022-08-23
    • 2019-02-09
    • 2013-03-30
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多