title: Why is my pipe in C not working?
body: <p>as an exercise I need to use a signal handler, and pipes to send some messages between two processes, when getting a signal. Below is my sourcecode. When I'm running it, I can get the pipes to work, both processes can talk, as long as I call the pipe in their main-method (in this case process1() and process2() ).
  But I want to use the pipes inside the signalhandlers. But now the pipes don't work.
  This is some output I got:</p>
  
  <pre><code>3 - 4 and 5 - 6
  Segv at 8825
  USR1 at 8824
  898 sent to 4
  130 received on 3
  130
  </code></pre>
  
  <p>The '898' and '130' should be equal, but aren't.
  I know the pipes are working correctly, so I think it has something to do with the signalstuff...
  But what...?</p>
  
  <p>Sourcecode:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sys/wait.h&gt;
  
  int fd1[2], fd2[2], status;
  int cpid, cpoid;
  
  void process1() {   
      cpid = getpid();        /*What's my process ID?*/
      cpoid = cpid + 1;       /*And what's the other process ID?*/
  
      close(fd1[0]);
      close(fd2[1]);
  
      while (1) {}
  }
  
  void process2() {   
      cpid = getpid();
      cpoid = cpid - 1;
  
      close(fd1[1]);
      close(fd2[0]);
  
      raise(SIGSEGV);         /*Start with a SegV signal*/
  
      while (1) {}
  }
  
  /*Method to send a message to the other process, by pipe*/
  void send (int msg) {
      if (cpid &lt; cpoid) {
          write(fd1[1], &amp;msg, 1);
          printf("%d sent to %d\n", msg, fd1[1]);
      } else {
          write(fd2[1], &amp;msg, 1);
          printf("%d sent to %d\n", msg, fd2[1]);
      }
  }
  
  /*Method to receive a message from the other process*/
  int receive () {
      int msg = 0;
      if (cpid &lt; cpoid) {
          read(fd2[0], &amp;msg, 1);
          printf("%d received on %d\n", msg, fd2[0]);
      } else {
          read(fd1[0], &amp;msg, 1);
          printf("%d received on %d\n", msg, fd1[0]);
      }
      return msg;
  }
  
  /*The SegV Signal handler*/
  void segvHandler() {
      int y = -1;
      printf("Segv at %d\n", cpid);
      kill(cpoid, SIGUSR1);           /*Send an USR1 Signal to the other proces*/
  
      while (y != 898) {
          y = receive();
          printf("%d\n", y);
      }
  }
  
  /*The Usr1 Signal handler*/
  void usr1Handler() {
      int x = 898;
      printf("USR1 at %d\n", cpid);
  
      send(x);
  }
  
  int main (int argc, char *argv[]) {
  
      if (pipe(fd1) &lt; 0) {
          fprintf (stderr, "Could not make pipe\n");
          return (EXIT_FAILURE);
      }
      if (pipe(fd2) &lt; 0) {
          fprintf (stderr, "Could not make pipe\n");
          return (EXIT_FAILURE);
      }
      printf("%d - %d and %d - %d\n", fd1[0], fd1[1], fd2[0], fd2[1]);    /*Pipe numbers*/
  
      signal(SIGUSR1, usr1Handler);   /*Signal handlers*/
      signal(SIGSEGV, segvHandler);
  
      if (fork() != 0) {
          process1();
      } else {
          process2();
      }
      waitpid(-1, &amp;status, 0);
  
      return EXIT_SUCCESS;
  }
  </code></pre>