Blame posix/test-vfork.c

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