Advertisement
Guest User

C signaling demo

a guest
May 15th, 2017
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.38 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <signal.h>
  6.  
  7. void parent_work(int signo);
  8. void child_work(int signo);
  9.  
  10. void syserr_quit(char *msg);
  11.  
  12. pid_t parent_pid;
  13. pid_t child_pid;
  14.  
  15. int main () {
  16.     parent_pid = getpid();
  17.     printf("parent pid: %d\n", parent_pid);
  18.  
  19.     pid_t pid = fork();
  20.     if (pid < 0) {
  21.         syserr_quit("fork error");
  22.     } else if (pid == 0) {
  23.         signal(SIGUSR2, child_work);
  24.         while (1) {}
  25.     } else {
  26.         child_pid = pid;
  27.         printf("child pid: %d\n", pid);
  28.         signal(SIGUSR1, parent_work);
  29.         while (1) {}
  30.     }
  31. }
  32.  
  33. void child_work (int signo) {
  34.     sleep(1); // fake child work
  35.  
  36.     // signal parent that a write is now possible
  37.     printf("send signal to %d\n", parent_pid); fflush(stdout);
  38.     if (kill(parent_pid, SIGUSR1) < 0) syserr_quit("kill error");
  39.     printf("signal sent\n"); fflush(stdout);
  40.  
  41.     // wait for parent signal
  42.     pause();
  43. }
  44.  
  45. void parent_work (int signo) {
  46.     sleep(1); // fake parent work
  47.  
  48.     // signal child that a read is possible
  49.     printf("send signal to %d\n", child_pid); fflush(stdout);
  50.     if (kill(child_pid, SIGUSR2) < 0) syserr_quit("kill error");
  51.     printf("signal sent\n"); fflush(stdout);
  52.  
  53.     // wait for child signal
  54.     pause();
  55. }
  56.  
  57. void syserr_quit(char *msg) {
  58.     perror(msg);
  59.     exit(EXIT_FAILURE);
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement