Home | History | Annotate | Line # | Download | only in c
      1 /*
      2 #progos: linux
      3 #output: got: a\nthen: bc\nexit: 0\n
      4 */
      5 
      6 /* This is a very limited subset of what ex1.c does; we just check that
      7    thread creation (clone syscall) and pipe writes and reads work. */
      8 
      9 #include <stddef.h>
     10 #include <stdio.h>
     11 #include <stdlib.h>
     12 #include <unistd.h>
     13 #include <sched.h>
     14 #include <signal.h>
     15 #include <sys/types.h>
     16 #include <sys/wait.h>
     17 
     18 int pip[2];
     19 
     20 int
     21 process (void *arg)
     22 {
     23   char *s = arg;
     24   if (write (pip[1], s+2, 1) != 1) abort ();
     25   if (write (pip[1], s+1, 1) != 1) abort ();
     26   if (write (pip[1], s, 1) != 1) abort ();
     27   return 0;
     28 }
     29 
     30 int
     31 main (void)
     32 {
     33   int retcode;
     34   int pid;
     35   int st;
     36   long stack[16384];
     37   char buf[10] = {0};
     38 
     39   retcode = pipe (pip);
     40 
     41   if (retcode != 0)
     42     {
     43       fprintf (stderr, "Bad pipe %d\n", retcode);
     44       abort ();
     45     }
     46 
     47   pid = clone (process, (char *) stack + sizeof (stack) - 64,
     48 	       (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
     49 	       | SIGCHLD, "cba");
     50   if (pid <= 0)
     51     {
     52       fprintf (stderr, "Bad clone %d\n", pid);
     53       abort ();
     54     }
     55 
     56   if ((retcode = read (pip[0], buf, 1)) != 1)
     57     {
     58       fprintf (stderr, "Bad read 1: %d\n", retcode);
     59       abort ();
     60     }
     61   printf ("got: %c\n", buf[0]);
     62   retcode = read (pip[0], buf, 2);
     63   if (retcode == 1)
     64     {
     65       retcode = read (pip[0], buf+1, 1);
     66       if (retcode != 1)
     67 	{
     68 	  fprintf (stderr, "Bad read 1.5: %d\n", retcode);
     69 	  abort ();
     70 	}
     71       retcode = 2;
     72     }
     73   if (retcode != 2)
     74     {
     75       fprintf (stderr, "Bad read 2: %d\n", retcode);
     76       abort ();
     77     }
     78 
     79   printf ("then: %s\n", buf);
     80   retcode = wait4 (-1, &st, WNOHANG | __WCLONE, NULL);
     81 
     82   if (retcode != pid || !WIFEXITED (st))
     83     {
     84       fprintf (stderr, "Bad wait %d %x\n", retcode, st);
     85       abort ();
     86     }
     87 
     88   printf ("exit: %d\n", WEXITSTATUS (st));
     89   return 0;
     90 }
     91