苏嵌学习之进程通行二信号通信 (过去用新浪博客写的现在搞过来~~~)

本文详细介绍了Linux中信号的概念、作用、处理方式及如何在用户进程与内核进程间进行交互。包括信号的发送与捕捉、信号的处理方法(如忽略、捕捉和执行缺省操作),以及信号在进程间通信的应用实例。此外,还提供了关于信号处理函数的使用说明,如alarm()、pause()等函数的用途和实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式

信号可以直接进行用户空间进程(注册和注销[这个注销不是很清楚])和内核进程(内核产生)之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。

如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程

<wbr></wbr>

用户进程对信号的响应方式:
忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。
捕捉信号:定义信号处理函数(后面说),当信号发生时,执行相应的处理函数。
执行缺省操作:Linux对每种信号都规定了默认操作 (man kill 看看,有很多)


信号发送与捕捉

kill()和raise()

kill –l 命令查看系统支持的信号列表

raise函数允许进程向自己发送信号

#include <signal.h>
#include <sys/types.h>
int kill(pid_t pid, int sig);(pid = -1,你会关机哦~~~~)

<wbr></wbr>

#include <signal.h>
#include <sys/types.h>
int raise(int sig);

<wbr></wbr>

alarm()和pause()

alarm()也称为闹钟函数,它可以在进程中设置一个定时器。当定时器指定的时间到时,内核就向进程发送SIGALARM信号。

pause()函数是用于将调用进程挂起直到收到信号为止。

#include <unistd.h>
unsigned int alarm(unsigned int seconds)

如果调用此alarm()前,进程中已经设置了闹钟时间,则
返回上一个闹钟时间的剩余时间,否则返回0。

<wbr></wbr>

#include <unistd.h>
int pause(void);

<wbr></wbr>

信号的处理:

信号处理的主要方法有两种
使用简单的signal()函数
使用信号集函数组(不大会)

<wbr></wbr>

signal()
使用signal函数处理时,需指定要处理的信号和处理函数
使用简单、易于理解(这个函数不好理解~~~~)

<wbr></wbr>

所需头文件: <wbr><wbr><wbr>#include &lt;signal.h&gt;<br> 函数原型: <wbr><wbr><wbr><wbr><wbr>void (*signal(int signum, void (*handler)(int)))(int);<br> 函数传入值: <wbr><wbr><wbr>signum:指定信号<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>handler: <wbr>SIG_IGN:忽略该信号。<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>SIG_DFL:采用系统默认方式处理信号。<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>自定义的信号处理函数指针<br> 函数返回值: <wbr><wbr><wbr>成功:设置之前的信号处理方式<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>出错:-1</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数), 而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.

在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的.

一个简单的例子:

void my_func(int sign_no)
{
<wbr>if (sign_no = = SIGINT)<br><wbr><wbr>printf("I have got SIGINT\n");<br><wbr>else if (sign_no = = SIGQUIT)<br><wbr><wbr>printf("I have got SIGQUIT\n");<br> }</wbr></wbr></wbr></wbr></wbr></wbr>

int main()
{
<wbr>printf("Waiting for signal SIGINT or SIGQUIT \n ");<br><wbr>signal(SIGINT, my_func);<br><wbr>signal(SIGQUIT, my_func);<br><wbr>pause();<br><wbr>exit(0);<br> }<br></wbr></wbr></wbr></wbr></wbr>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值