进程间通信—信号(一)
2013-08-22 21:04
106 查看
信号机制是linux系统中最为古老的进程之间的通信机制。
What:信号是一种Event时间,原理都是中断机制,是一种异步处理,是一种通知。
How to do:
1、分析信号的发送方和接收方是谁
2、在接受方做好信号的安装注册。(主要是回调函数)
3、发送方触发信号的event事件发生了,驱动了在接收方应急准备好的回调函数。
最常用的发送信号的系统函数是kill(),rise(),alarm()和setitimer()等函数。
linux下可以使用“ kill -l”命令列出所有的信号:
我们来看一个用kill()函数发送信号的例子,在这个例子中,我们还定义了一个pid_printf()函数,在每行输出语句前都自动
插入当前进程ID,这样可以方便的从输出结果中看到每一句是被哪个进程输出的。
请注意一个细节,当子进程法术SIGUSR2信号的时候,父进程并不是立即捕捉到信号,因为父进程还需要等待调度。当进程被调度的时候,
信号的处理也不一定是按照信号发送的顺序被处理的。
What:信号是一种Event时间,原理都是中断机制,是一种异步处理,是一种通知。
How to do:
1、分析信号的发送方和接收方是谁
2、在接受方做好信号的安装注册。(主要是回调函数)
3、发送方触发信号的event事件发生了,驱动了在接收方应急准备好的回调函数。
最常用的发送信号的系统函数是kill(),rise(),alarm()和setitimer()等函数。
linux下可以使用“ kill -l”命令列出所有的信号:
我们来看一个用kill()函数发送信号的例子,在这个例子中,我们还定义了一个pid_printf()函数,在每行输出语句前都自动
插入当前进程ID,这样可以方便的从输出结果中看到每一句是被哪个进程输出的。
#include <stdarg.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> void pid_printf(char *format,...) { va_list ap; va_start(ap,format); printf("[%d]",getpid()); vprintf(format,ap); va_end(ap); } void signal_handler(int signo) { int ret; pid_t pid_c; switch(signo) { case SIGCHLD: pid_c=wait(&ret); pid_printf("Child process PID [%d] return [%d].\n",pid_c,ret); break; case SIGUSR2: pid_printf("Signal SIGUSR2 received\n"); break; default: pid_printf("Signal [%d] received\n",signo); break; } } int main(int argc,char **argv) { pid_t pid; signal(SIGCHLD,signal_handler); signal(SIGUSR2,signal_handler); pid=fork(); if(pid == 0) { pid_printf("Child process send signal SIGUSR2 to parent process.\n"); kill(getppid(),SIGUSR2); pid_printf("Child process will exit with status 0.\n"); exit(0); } else if(pid != -1) { while(1) { sleep(1); } } else { pid_printf("There was an error with forking!\n"); } return 0; }运行这个程序输出如下结果:
请注意一个细节,当子进程法术SIGUSR2信号的时候,父进程并不是立即捕捉到信号,因为父进程还需要等待调度。当进程被调度的时候,
信号的处理也不一定是按照信号发送的顺序被处理的。
相关文章推荐
- Linux环境进程间通信(二): 信号(下)
- 进程间通信简介(一)——信号
- Linux环境进程间通信---信号(下)
- 进程间通信_04信号
- 6、linux进程间通信之信号通信
- 传统的进程间通信方式 1.无名管道(pipe) 2.有名管道(fifo) 3.信号(signal); 闹钟信号应用实例
- 进程间通信之信号量
- linux下用信号关bash系统函数-----进程间通信
- Linux 进程间通信 --- 信号通信 --- signal
- (进程间通信)IPC 信号(signal)基本函数实现的mysleep(unsined int)
- linux进程间通信--信号量
- Linux环境进程间通信(二): 信号(下)
- 进程间通信学习笔记二(信号通信)
- Linux进程间通信——信号集函数
- Linux进程间通信(2):信号
- Linux环境进程间通信(二): 信号
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
- 深入理解进程间通信之信号
- 进程间通信--信号发送
- Linux环境进程间通信(二): 信号(上)