Linux系统编程_10_信号
信号处理机制在linux编程中非常重要,它类似于单片机中的中断系统;我们在编写中断函数时,需要设置中断函数的地址,设置其相应的寄存器,以便于产生中断事件时可以正确的跳到中断函数去履行; linux中信号和这个类似,1般的编程模型是定义中断函数,然后把中断函数注册,使得进程收到特定的信号时,可以跳到信号处理函数去履行;
1.kill函数与raise函数 kill函数用来将信号发送给进程或进程组; ――int kill(pid_t pid, int signo); raise函数则允许进程向本身发送信号; ――int raise(int signo); 调用raise(signo);等价于kill(getpid(),signo);
不单单是kill函数 kill命令也能够用来发送信号: 如: kill -l ――列出所有信号 kill -s 10 pid ―― 10代表SIGUSR1 pid代表向哪一个进程发送USR1信号 也能够这样写:kill -USR1 pid
回到kill函数; 注意:kill函数的第1个参数:
下面是1个使用kill函数的例子: #include <stdio.h>
#include <stdlib.h>
#include <signal.h>
pid_t pid;
void fun(int a)
{
if(a == SIGABRT)
printf("Have fun!
");
if(a == SIGUSR1)
{
printf("Fuck!
");
}
}
void send()
{
kill(pid,SIGUSR1);// Only send msg to progress or progress group!
}
int main()
{
int cnt = 0;
signal(SIGABRT,fun);
signal(SIGUSR1,fun);
pid = fork();
if(pid == 0)
{
while(1)
{
printf("Child!
");
sleep(1);
}
}
while(1)
{
printf("Father!
");
cnt++;
if(cnt == 5)
send();
sleep(1);
}
}
2. alarm函数和pause函数 alarm函数用来设定计时器,设定的某个时间超时时,会产生1个SIGALRM信号,如果不捕捉改信号,默许会终止调用该alarm函数的进程。 ―― unsigned int alarm(unsigned int seconds); pause函数使得调用进程挂起直到捕捉到1个信号。 ―― int pause(void); 实例: #include <signal.h>
#include <stdio.h>
void fun(int id)
{
if(id == SIGUSR1)
{
printf("SIGUSR1
");
}
if(id == SIGALRM)
{
printf("SIGALRM!
");
}
}
int main()
{
signal(SIGUSR1,fun);
signal(SIGALRM,fun);
alarm(5); // if not catch,progress return;
for(;;)
pause();
return 0;
} 3.信号集 1个可以包括多个信号的信号集,这个数据类型是sigset_t,同时,也有相应的信号集函数;
还有以下1些函数:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |