Updated to fedora-glibc-20041207T1331
[glibc.git] / nptl / tst-getpid1.c
blob9d637159c40c1a3913835972a3f9949b821e6893
1 #include <sched.h>
2 #include <signal.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <sys/wait.h>
8 static int sig;
10 static int
11 f (void *a)
13 puts ("in f");
14 union sigval sival;
15 sival.sival_int = getpid ();
16 printf ("pid = %d\n", sival.sival_int);
17 if (sigqueue (getppid (), sig, sival) != 0)
18 return 1;
19 return 0;
23 static int
24 do_test (void)
26 int mypid = getpid ();
28 sig = SIGRTMIN;
29 sigset_t ss;
30 sigemptyset (&ss);
31 sigaddset (&ss, sig);
32 if (sigprocmask (SIG_BLOCK, &ss, NULL) != 0)
34 printf ("sigprocmask failed: %m\n");
35 return 1;
38 char st[128 * 1024];
39 pid_t p = clone (f, st + sizeof (st), 0, 0);
40 if (p == -1)
42 printf("clone failed: %m\n");
43 return 1;
45 printf ("new thread: %d\n", (int) p);
47 siginfo_t si;
49 if (sigwaitinfo (&ss, &si) < 0)
51 printf("sigwaitinfo failed: %m\n");
52 kill (p, SIGKILL);
53 return 1;
55 while (si.si_signo != sig || si.si_code != SI_QUEUE);
57 if (si.si_int != (int) p)
59 printf ("expected PID %d, got si_int %d\n", (int) p, si.si_int);
60 kill (p, SIGKILL);
61 return 1;
64 if (si.si_pid != p)
66 printf ("expected PID %d, got si_pid %d\n", (int) p, (int) si.si_pid);
67 kill (p, SIGKILL);
68 return 1;
71 int e;
72 if (waitpid (p, &e, __WCLONE) != p)
74 puts ("waitpid failed");
75 kill (p, SIGKILL);
76 return 1;
78 if (!WIFEXITED (e))
80 puts ("did not terminate correctly");
81 return 1;
83 if (WEXITSTATUS (e) != 0)
85 printf ("exit code %d\n", WEXITSTATUS (e));
86 return 1;
89 if (getpid () != mypid)
91 puts ("my PID changed");
92 return 1;
95 return 0;
98 #define TEST_FUNCTION do_test ()
99 #include "../test-skeleton.c"