Linux14 信号的使用及底层实现

(一)信号

操作系统预先定义好的某些特定的事件,信号可以被产生,也可以被接受。产生和接收的主体都是进程。

进程接受到信号后,怎么处理——信号的响应方式:默认SIG_DFL, 忽略IG_IGN,自定义

如何修改信号的响应方式:typedef  void(*Fun) (int);

Fun signal (int signum,Fun fun);//修改信号响应方式的函数signal,信号值,信号类型,修改的是哪一个信号的响应方式。在/usr/include/bits/signum.h里面定义的都是信号,都是宏。

SIGINT  Ctrl+z

SIGCHLD 子进程状态被改变是触发的信号。

(二)信号的发送

int kill(int pid,int sigtype);

pid:将信号发送的进程,pid>0 指定接收信号的pid,pid==0 将信号发送给当前进程组中的所有进程,pid==-1,将信号发送给系统上所有的进程,p<-1,将信号发送给进程组id为-pid组内所有进程。

(作业:用kill函数实现kill命令,kill  pid默认发送的是15号信号,命令结束的进程是通过信号机制实现的)

(三)信号的底层实现机制

都调用了send_sig(SIGINT,PCB,flag);

       连续接收到n次信号,如果第一个信号正在处理则第二个信号会等待第一个处理完成,接收信号的进程会将生育所有的信号都合并成一个信号。信号响应方式一旦修改,后续接收信号一直沿用,直到进程终止或者再次修改。

实现:进程第一次接收打印hello world,第二次接收结束进程。Ctr C=SIGINT

第一次接收到信号和第二次接收到信号之间将响应方式修改。只能在第一次修改处理函数中修改信号的响应方式。

#include<signal.h>

void fun(int sig)

{

    printf("sig start = %d\n",sig);

    sleep(10);

    signal(SIGINT,SIG_DFL);

    printf("sig end = %d\n",sig);

signal(SIGINT,SID_DFL);

}

int main(int argc,char*argv[],char*envp[])

{

    signal(SIGINT,fun);

    while(1)

    {

        printf("main hello\n");

        sleep(1);

    } exit(0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值