1.信号类型:
linux系统支持的所有信号均定义在/usr/include/asm/signal.h
常见的信号有:
SIGKILL:杀死进程
SIGSTOP:暂停进程
SIGCHLD:子进程停止或者结束时用来通知父进程
函数学习:
1》函数原型:
int kill(pid_t pid ,int sig);
头文件:
#include<sys/types.h>
#include<signal.h>
函数功能:
发送信号给一个进程
返回值:
成功(至少有一个信号被发送):0
失败: -1;
参数:
pid:
如果 pid>0 ,pid 指向信号要送往的进程的进程ID
如果pid=0 sig 将送到所有与电泳kill()那个进程同属一个组的进程。
如果pid=-1 sig 将送到所有有权给其发送信号的调用进程,除了进程1(init)
如果pid<-1 sig 将送到进程组的ID=pid 的每一个进程
sig:
如果sig=0,表示没有任何信号送出,系统通常会利用sig 值是否为0 检验某个进程是否仍在执行。
2》函数原型:
typedef void (*sighandler_t)(int);
注释:为复杂的定义声明一个简单的别名,参考typedef 用法四
sighandler_t :函数指针类型:
sighandler_t signal(int signum,sighandler_t handler);
头文件:
#include <signal.h>
函数功能:
设置信号处理处理方式
返回值:
成功:处理函数的指针
失败:SIGERR
参数:
signum:要处理的信号
handler:对应信号的处理方式;
可能取值:
SIG_IGN:忽略这个信号
SIG_DFL:交给内核处理
用户自定义: 用户处理函数
3》函数原型:
int pause(void);
头文件:
#include<unistd.h>
函数功能:
等待一个信号(pause()导致这个调用pause的进程(或线程)休眠,直到一个信 号被传递)
返回值:
只返回:-1
范例代码:
设计思路说明:首先写一个接受信号,并处理信号的程序->handler.c,send.c 程序发送信号
handler.c
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
void handler(int signum)
{
printf("recv signal is :%d\n",signum);
}
int main()
{
signal(SIGINT,handler);
pause();
}
send.c
#include<sys/types.h>
#include<signal.h>
#include<stdio.h>
int main(int argc ,char *argv[])
{
pid_t pid;
pid=atoi(argv[1]);//handler 程序的pid
kill(pid,SIGINT);
return 0;
}
运行结果:
首先运行handler程序,处于阻塞状态;
然后通过ps -aux 查看handler 程序的pid
运行send程序 ./send pid(handler的进程ID)