home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume11 / musbus / part02 / context1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-09-16  |  1.3 KB  |  68 lines

  1. /*
  2.  *  Context switching via synchronized unbuffered pipe i/o
  3.  *
  4.  *  $Header: context1.c,v 3.4 87/06/22 14:22:59 kjmcdonell Beta $
  5.  */
  6.  
  7. main(argc, argv)
  8. int    argc;
  9. char    *argv[];
  10. {
  11.     int    check;
  12.     int    iter;
  13.     int    p1[2], p2[2];
  14.  
  15.     if (argc != 2) {
  16.         printf("Usage: context count\n");
  17.         exit(1);
  18.     }
  19.  
  20.     iter = atoi(argv[1]);
  21.     if (pipe(p1) || pipe(p2)) {
  22.         perror("pipe create failed");
  23.         exit(1);
  24.     }
  25.  
  26.     if (fork()) {
  27.         /* master, write p1 & read p2 */
  28.         close(p1[0]); close(p2[1]);
  29.         while (iter > 0) {
  30.             if (write(p1[1], (char *)&iter, sizeof(iter)) != sizeof(iter)) {
  31.                 perror("master write failed");
  32.                 exit(1);
  33.             }
  34.             if (read(p2[0], (char *)&check, sizeof(check)) != sizeof(check)) {
  35.                 perror("master read failed");
  36.                 exit(1);
  37.             }
  38.             if (check != iter) {
  39.                 printf("Master sync error: expect %d, got %d\n",
  40.                     iter, check);
  41.                 exit(2);
  42.             }
  43.             iter--;
  44.         }
  45.     }
  46.     else {
  47.         /* slave, read p1 & write p2 */
  48.         close(p1[1]); close(p2[0]);
  49.         while (iter > 0) {
  50.             if (read(p1[0], (char *)&check, sizeof(check)) != sizeof(check)) {
  51.                 perror("slave read failed");
  52.                 exit(1);
  53.             }
  54.             if (check != iter) {
  55.                 printf("Slave sync error: expect %d, got %d\n",
  56.                     iter, check);
  57.                 exit(2);
  58.             }
  59.             if (write(p2[1], (char *)&iter, sizeof(iter)) != sizeof(check)) {
  60.                 perror("slave write failed");
  61.                 exit(1);
  62.             }
  63.             iter--;
  64.         }
  65.     }
  66.     exit(0);
  67. }
  68.