mirror of git://sourceware.org/git/glibc.git
				
				
				
			
		
			
				
	
	
		
			43 lines
		
	
	
		
			773 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			773 B
		
	
	
	
		
			C
		
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| #include <error.h>
 | |
| #include <errno.h>
 | |
| #include <sys/wait.h>
 | |
| 
 | |
| void __attribute_noinline__ noop (void);
 | |
| 
 | |
| #define NR	2	/* Exit code of the child.  */
 | |
| 
 | |
| int
 | |
| main (void)
 | |
| {
 | |
|   pid_t pid;
 | |
|   int status;
 | |
| 
 | |
|   printf ("Before vfork\n");
 | |
|   fflush (stdout);
 | |
|   pid = vfork ();
 | |
|   if (pid == 0)
 | |
|     {
 | |
|       /* This will clobber the return pc from vfork in the parent on
 | |
| 	 machines where it is stored on the stack, if vfork wasn't
 | |
| 	 implemented correctly, */
 | |
|       noop ();
 | |
|       _exit (NR);
 | |
|     }
 | |
|   else if (pid < 0)
 | |
|     error (1, errno, "vfork");
 | |
|   printf ("After vfork (parent)\n");
 | |
|   if (waitpid (0, &status, 0) != pid
 | |
|       || !WIFEXITED (status) || WEXITSTATUS (status) != NR)
 | |
|     exit (1);
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| void
 | |
| noop (void)
 | |
| {
 | |
| }
 |