如何向C中的进程发送信号?

我需要向一个进程发送一个信号,当进程收到这个信号它会做一些事情时,如何在C中最好地实现?

向进程发送信号的方法是kill(pid, signal); 但是,您应该知道,除了由于固有竞争条件导致的父对子直接消息之外,信号不是进程间通信的有力手段。 管道,文件,目录,命名信号量,套接字,共享内存等都为进程间通信提供了极好的方法。

我碰巧遇到了一个unix:

男人2杀了

男人2信号

男人2 sigvec

kill + fork runnable POSIX示例

是时候玩得开心了:

 #define _XOPEN_SOURCE 700 #include  #include  #include  /* false */ #include  /* perror */ #include  /* EXIT_SUCCESS, EXIT_FAILURE */ #include  /* wait, sleep */ #include  /* fork, write */ void signal_handler(int sig) { char s1[] = "SIGUSR1\n"; char s2[] = "SIGUSR2\n"; if (sig == SIGUSR1) { write(STDOUT_FILENO, s1, sizeof(s1)); } else if (sig == SIGUSR2) { write(STDOUT_FILENO, s2, sizeof(s2)); } signal(sig, signal_handler); } int main() { pid_t pid; signal(SIGUSR1, signal_handler); signal(SIGUSR2, signal_handler); pid = fork(); if (pid == -1) { perror("fork"); assert(false); } else { if (pid == 0) { while (1); exit(EXIT_SUCCESS); } while (1) { kill(pid, SIGUSR1); sleep(1); kill(pid, SIGUSR2); sleep(1); } } return EXIT_SUCCESS; } 

编译并运行:

 gcc -std=c99 signal_fork.c ./a.out 

结果:

 SIGUSR1 SIGUSR2 SIGUSR1 SIGUSR2 .... 

但要注意处理信号时有许多复杂性:

  • 只能从信号处理程序调用某些函数: 为什么只能安全地从信号处理程序中调用异步信号安全函数?
  • 当被信号中断时,不同的function具有不同的行为: man 7 signalSA_RESTART
  • 如果全局变量的类型为sig_atomic_t则只能从信号处理程序访问它们: sig_atomic_t实际上如何工作?

测试在Ubuntu 17.10, GitHub上游 。