我有一个多线程的应用程序 - 一个线程负责用wait()收集死孩子,另一个线程根据请求用fork生成它们。
我发现在一个拥有2.4内核和LinuxThread的平台上,等待总是因ECHILD而失败。我发现问题可能出在2.4内核上LinuxThreads的非POSIX兼容实现中,following discussion表明没有办法解决这个问题。
我仍然想确定没有人知道任何解决方案。即使是内核的补丁也是可以接受的。
当我考虑应用程序设计时,我认为不可能在单个线程中执行fork()和wait()(或者只需付出巨大的努力)
答案 0 :(得分:1)
在我看来,这种(显然是虚假的)行为是LinuxThreads实现的特性。
似乎只有两种方法 - 要么切换到NPTL(需要内核2.6),要么避免使用这种多线程的fork / wait模型(这是我解决问题的方法,而且很难让架构变得复杂一点复杂的,它仍然可以在一天内完成。
以下示例是在LinuxThreads上失败的虚假情况的裸骨示例。
#include <pthread.h> #include <sys/wait.h> #include <unistd.h> #include <errno.h> void * wait_for_child(void *arg) { int s; pid_t ret; ret = wait(&s); if (ret == -1 && errno == ECHILD) perror("Bogus LinuxThreads encountered"); return NULL; } int main(int argc, char ** argv) { pid_t pid = fork(); if (pid == -1) return 1; // child waits and then dies if (pid == 0) { sleep(3); return 0; } pthread_t wt; pthread_create(&wt, NULL, wait_for_child, NULL); pthread_join(wt, NULL); return 0; }
答案 1 :(得分:0)
如果您开始考虑内核补丁,那么就该考虑升级了。 2.4牙齿很长。