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些函数:


波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » Linux系统编程_10_信号

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡