您的位置:首页 > 运维架构 > Linux

Linux信号通讯编程

2015-08-10 15:55 316 查看
信号通讯流程为:

①进程A/内核选择信号

②发送信号

③进程B接收信号并处理

Linux系统支持的所有信号均定义在/usr/include/asm/signal.h,其中常见的信号有:

①SIGKILL:杀死进程

②SIGSTOP:暂停进程

③SIGCHLD:子进程停止或结束时用来通知父进程

常用到的函数有:

kill函数

原型:int kill(pid_t,int sig)
头文件:<sys/types.h><signal.h>
功能:向进程发送信号,成功返回0,失败返回-1
参数:pid的值有多种选择
1. pid大于零时,pid是信号欲送往的进程的ID。
2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
4. pid小于-1时,信号将送往以-pid为组标识的进程。
sig:发送的信号


signal函数

原型:typedef void (*sighandler_t)(int);/*函数指针*/
sighandler_t signal(int signum,sighandler_t handler)
头文件:<signal.h>
功能:设置信号处理方式,成功则返回处理函数的函数指针,失败返回SIG_ERR
参数:signum:要处理的信号
handler:对应着signum信号的处理方式,可以取SIG_IGN,SIG_DFL或用户自定义的函数,其中SIG_IGN为忽略信号,SIG_DFL为交给Linux内核处理


pause函数

原型:int pause(void)
头文件:<unistd.h>
功能:等待信号


实例

进程B接收信号并根据信号做出处理:

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void func(int a)
{
printf("process received a signal\n");
}
void main()
{
signal(10,func);
pause();
}


进程A发送信号给进程B.由于发送信号kill需要知道进程B的id,所以在运行进程A的时候要输入进程B的id,而进程B的id可通过命令ps aux查看。

#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
void main(int argc,char* argv[])
{
pid_t pid;
pid=atoi(argv[1]);/*将argv[1]由char型转化为int型*/
kill(pid,10);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: