Мне кажется, что это (очевидно поддельное) поведение является особенностью реализации 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;
}