IPC——信号

信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:
一.当用户按某些键时,产生信号。
二.硬件异常产生信号:除数为零,非法的存储访问等等。这些情况通常是由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正在访问一个无效存储区的进程产生一个

SIGSEGV(SIG is a common prefix for signal names; SEGV is an abbreviation of segmentation violation)。
三.进程用kill函数将信号发送给另一个进程
四.用户可用kill命令将信号发送给其它进程


几种常见信号:
SIGHUP:从终端上发出的结束信号
SIGINT:来自键盘的中断信号(Ctrl-C)
SIGKILL :该信号结束接收信号的进程
SIGTERM:kill命令发出的信号
SIGCHLD:标识子进程停止或结束的信号
SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号


当某信号出现时,将按照下列三种方式中的一种进行处理:
一.忽略次信号
大多数信号都按照这种方式进行处理,但是有两种信号却不能被忽略。它们是:
SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供了一种终止或者停止进程的方法。
二.执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数。在这个用户函数中执行用户希望的处理。
三.执行系统默认的动作
对大多数信号的系统默认动作时终止该进程


信号发送
发送信号的主要函数有killraise
区别:
Kill既可以向自身发送信号,也可以向其它进程发送信号。
raise函数是向进程自身发送信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo)
int raise(int signo)

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

pause函数使得调用进程挂起直至捕捉到一个信号。
#include <unistd.h>
int pause(void)
只有执行了一个信号处理函数后,挂起才结束。
信号的处理:当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式。


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

#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int)
相当与下面两步操作:
typedef void (*sighander_t)(int) //定义一个函数类型为sighander_t
sighander_t signal(int signum, sighandler_t hander))
//signal 函数的返回值类型为sighander_t,参数为int型和sighander_t型

func可能的值为:
一.SIG_IGN:忽略此信号
二.SIG_DFL:按系统默认方式处理
三.信号处理函数名:使用该函数处理


示例如下:
#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);
}

注意:
首先在一个命令中端中执行该程序                    
./mysignal

开启另一新的终端:用ps –aux 查看运行该程序的进程PID          ps -aux

可以找到:

root  3891 0.0 0.0 1500 308 pts/1 S+ 12:54 0:00 ./mysignal

用kill命令向查看得到的进程号为PID的进程发送SIGINT or SIGQUIT       kill -s SIGINT 3891

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值