在我看来,这种(显然是虚假的)行为是 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;
}