1

我有一个多线程的应用程序 - 一个线程负责用 wait() 收集死去的孩子,另一个线程根据请求用 fork 生成它们。

我发现在一个具有 2.4 内核和 LinuxThread 的平台上等待总是失败并出现 ECHILD。我发现问题可能出在 2.4 内核上不符合 POSIX 标准的 LinuxThreads 实现中,以下讨论表明无法解决此问题。

我仍然想确定没有人知道任何解决方案。甚至内核的补丁也是可以接受的。

当我考虑应用程序设计时,我认为不可能在单个线程中同时执行 fork() 和 wait() (或仅通过巨大的努力)

4

2 回答 2

1

在我看来,这种(显然是虚假的)行为是 LinuxThreads 实现的特征。

似乎只有两条出路——要么切换到 NPTL(需要内核 2.6),要么避免这种多线程 fork/wait 模型(这是我对问题的解决方案,它使架构变得更加复杂和复杂)仍然可以在一天内完成)

以下示例是在 LinuxThreads 上失败的虚假情况的简单示例。

#include <pthread.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>

无效 * wait_for_child(无效 *arg)
{
    整数;
    pid_t ret;
    ret = 等待(&s);
    if (ret == -1 && errno == ECHILD) perror("遇到假的 LinuxThreads");
    返回空值;    
}

int main(int argc, char ** argv)
{
    pid_t pid = fork();
    如果(pid == -1)返回 1;

    // 孩子等待然后死亡
    如果(pid == 0)
    {
        睡眠(3);
        返回0;
    }

    pthread_t 重量;
    pthread_create(&wt, NULL, wait_for_child, NULL);
    pthread_join(wt, NULL);
    返回0;
}
于 2009-06-24T23:41:09.477 回答
0

如果您开始考虑内核补丁,那么是时候考虑升级了。2.4 牙齿很长。

于 2009-06-23T16:41:46.743 回答