http://blog.chinaunix.net/uid-20528014-id-333569.html
http://zhidao.baidu.com/link?url=YGCDevofDnxZdkMjmIdhfhiELE-usQ-6xUGNDnsdhwu82UASqylJU7WzMzQ6sZXVRJVUQ8xv1J0kLxmWkx3GEa
1. 信号基本概念
信号(signal)是linux进程通讯中唯一的异步通讯方式。
信号从软件层次上看是对中断机制的一种模拟。一个进程收到信号时的处理方式与CPU收到中断请求时的处理方式一样。收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行。
2. 信号安装
信号的安装函数有两个:signal()与sigaction()。signal()常用于非实时信号;sigaction()常用于实时信号,它有更多的选项设置,最重要的是可以为实时信号安装带参数的回调。
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv)
{
struct sigaction act;
int sig;
sig = atoi(argv[1]);
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = new_op;
sigaction(sig, &act, NULL);
while(1)
{
printf("hello world\n");
sleep(2);
}
}
void new_op(int signum,siginfo_t *info,void *myact)
{
printf("***** receive signal %d ******\n", signum);
sleep(5);
}
执行:
Ø 启动程序:“./a.out 38&” (注:&作用是程序在新进程中执行)
Ø 使用ps查看进程PID
Ø 执行“kill –s 38 pid” (注:pid为上面用ps得到的pid)或者 killall -38 procname
Ø 会打印“***** receive signal %d ******\n”
3. 信号发送
kill 等函数