newlib-cygwin/winsup/testsuite/winsup.api/pthread/threadidafterfork.c

51 lines
1.0 KiB
C

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <stdlib.h>
static void * TestThread ( void * );
int main (void)
{
pthread_t t;
pthread_create (&t, NULL, TestThread, NULL);
pthread_join (t, NULL);
return 0;
}
static void * TestThread ( void *not_used )
{
pthread_t iAm = pthread_self();
int status;
switch (fork ())
{
case -1:
exit(1);
case 0:
if (iAm != pthread_self())
exit (1);
else
exit (0);
break;
default:
wait (&status);
if (status != 0)
exit (1);
}
exit(0);
}
/*
The forked child will not get the same thread handle as its parent, it
will get the thread handle from the main thread instead. The child will
not terminate because the threadcount is still 2 after the fork (it is
set to 1 in MTinterface::Init and then set back to 2 after the childs
memory gets overwritten by the parent).
concept test by Thomas Pfaff <tpfaff@gmx.net>
scritable test by Robert Collins <rbtcollins@hotmail.com>
*/