chiark / gitweb /
eglibc (2.11.3-4+deb6u3) squeeze-lts; urgency=medium
[eglibc.git] / posix / test-vfork.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <error.h>
5 #include <errno.h>
6 #include <sys/wait.h>
7
8 void __attribute_noinline__ noop (void);
9
10 #define NR      2       /* Exit code of the child.  */
11
12 int
13 main (void)
14 {
15   pid_t pid;
16   int status;
17
18   printf ("Before vfork\n");
19   fflush (stdout);
20   pid = vfork ();
21   if (pid == 0)
22     {
23       /* This will clobber the return pc from vfork in the parent on
24          machines where it is stored on the stack, if vfork wasn't
25          implemented correctly, */
26       noop ();
27       _exit (NR);
28     }
29   else if (pid < 0)
30     error (1, errno, "vfork");
31   printf ("After vfork (parent)\n");
32   if (waitpid (0, &status, 0) != pid
33       || !WIFEXITED (status) || WEXITSTATUS (status) != NR)
34     exit (1);
35
36   return 0;
37 }
38
39 void
40 noop ()
41 {
42 }