Linux笔记_进程通讯——信号通讯

本文介绍了Unix系统中的信号机制,包括信号产生的多种条件、常见的信号类型及其作用,还详细讲解了如何通过kill和raise函数发送信号,以及如何使用alarm和pause函数进行定时操作和等待信号。此外,还探讨了信号处理的不同方法,包括信号的忽略、执行默认动作及自定义处理函数。

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

******************************************************************
信号通讯

1.信号机制
信号机制是Unix系统中最为古老的进程间通信机制。很多条件可以产生一个信号:
1)当用户按某些按键时产生信号;
2)硬件异常产生信号:除数为零,无效的存储访问等等。通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程。
3)进程用kill函数将信号发送给另一个进程;
4)用户可用kil命令将信号发送给其它进程
 
2 信号类型
SIGHUP:从终端发出的结束信号
SIGINT:来自键盘的中断信号(Ctrl+C)
SIGKILL:该信号结束接收信号的进程
SIGTERM:kill命令发出的信号
SIGCHLD:标识子进程停止或结束的信号
SIGTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号

3 信号发送
发送信号的主要函数有kill和raise
区别:
kill既可以向自身发送信号,也可以向其它进程发送信号。与kill函数不同的是,raise函数是向进程自身发送信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo)
int raise(int signo)
kill的pid参数有四种不同的情况:

1)pid>0 将信号发给进程的ID为pid的进程;
2)pid==0 将信号发送给同组的进程;
3)pid<0将信号发送给其它进程组ID等于pid绝对值的进程;
4)pid==-1将信号发送给所有进程

Alarm函数
使用alarm函数可以设置一个时间值(闹钟时间)当所设置的时间到了时,产生SIGALRM信号。如果不捕捉此信号,则默认动作是终止该进程。每个进程只有一个闹钟时间。
#include <inistd.h>
unsigned int alarm(unsigned int seconds)  seconds:经过了指定的second秒后会产生信号SIGALRM。

pause函数:
使调用进程挂起直至捕捉到一个信号
#include <unistd.h>
int pause(void)
只有执行了一个信号处理函数后,挂起才结束。

4.  信号处理
有以下处理方式
1)忽略此信号:有两种信号不能忽略:SIGKILL和SIGTOP 因为他们向超级用户提供了已知终止或停止进程的方法
2)执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数,在用户函数中,执行用户希望的处理。
3)执行系统默认动作
对大多数信号的系统默认动作是终止该进程

信号处理的主要方法有两种,一种是使用简单的signal函数,另一种是使用信号集函数组。

指定信号处理的调用函数:
signal函数:
#include <signal.h>
void(*signal(int signo,void(*func)(int)))(int)  //函数:参数:1.int类型,2.函数指针;返回类型:函数指针
可以表示为:(看起来比较清晰)
typedef void(*sighandler_t)(int)
sighandler_t signall(int signum,sighandler_t handler)
Func 可能的值是:
1)SIG_IGN: 忽略此信号
2)SIG_DFL:按系统默认方式处理
3)信号处理函数名:使用该函数处理
演示:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void my_func(int sign_no)
{
     if(sign_no==SIGINT)
          printf("I have get SIGINT\n");
     else if(sign_no==SIGQUIT)
          printf("I have get SIGQUIT\n");
}
int main()
{
     printf("Waiting for signal SIGINT or SIGQUIT \n ");
    
     /*注册信号处理函数*/
     signal(SIGINT, my_func);
     signal(SIGQUIT, my_func);
    
     pause();
     exit(0);
}

******************************************************************8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值