testing一些POSIX代码,我注意到信号的使用不是很准确。 这里是客户端的示例代码:
#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #define MESSAGE "hello\n" #define PAUSE 15000 int main(int argc, char **argv) { int pid = atoi(argv[1]); size_t i; int j; for (i = 0; i < sizeof MESSAGE; ++i) { for (j = 0; j < MESSAGE[i]; ++j) { kill(pid, SIGUSR1); usleep(PAUSE); } kill(pid, SIGUSR2); usleep(PAUSE); } return 0; }
这里是服务器的代码:
#include <signal.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> static unsigned char index; static void inc(int sig) { ++index; (void) sig; } static void prt(int sig) { printf("%c", index); fflush(stdout); index = 0; (void) sig; } int main(void) { printf("%ld\n", (long int)getpid()); signal(SIGUSR1, inc); signal(SIGUSR2, prt); for (;;) ; return 0; }
服务器收到的字符取决于什么PAUSE
值有客户端。 它是来自信号极限,还是我犯了一个错误? 如果是这样,我在哪里可以find这些环境的考虑(我使用Linux 2.6.35)?
注意:要执行客户端的代码,必须在命令行参数中写入服务器的PID。
这种进程间通信不仅非常低效, 这也是无效的。 信号不排队; 他们要么正在等待,要么正在等待(*)。 因此,除非接收方在发送另一个信号之前读取信号,否则信号将丢失。
如果你真的想做这样的事情,收件人需要通过发回信号来确认收到的每个信号,发件人需要等待发送下一个信号,直到前一个被确认。
(*)实际上, 实时信号是排队的,但是队列的深度有一定的限制,要保证不超限,就需要痛苦而脆弱的实时优先级管理逻辑。