linux中系统信号机制,linux中的信号机制

概述

Linux信号机制是在应用软件层次上对中断机制的一种模拟,信号提供了一种处理异步事件的方法,例如,终端用户输入中断键(ctrl+c),则会通过信号机制停止一个程序[1]。

这其实就是向那个程序(进程)发送一个SIGINT信号。每个进程都有一个自己私有的信号处理函数映射表,当该进程成收到一个信号时,对应的信号处理函数被触发执行。而一个进程可以向另外一个进程发送信号,也可以向自己发送信号;操作系统内核也可以向一个进程发送信号,以通知某些硬件事件。信号处理函数映射表中共有64个表项。前32个信号,编号为1 ~ 31,有预定义的含义和处理函数;后32个作为扩充[2]。在终端输入命令“kill -l”就可以看到系统所支持所有的信号。

信号机制的两个常用函数

signal

#include

void (*signal(int signo, void (*func)(int)))(int);

返回值:若成功则返回信号以前的处理配置,如果出差则返回SIG_ERR;

或者用如下的定义:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signo, sighandler_t handler);

这个函数的功能是捕捉到相应的信号(signo),并用相应的处理函数(func/handler)来对信号进行相应的相应,是会替代原来的处理函数。但是要和足以,SIGKILL和SIGSTOP这两个信号是既不能被捕捉也不能被忽略的!(当时我们做一个后台程序,我还想用捕捉SIGKILL的方式来免杀呢)。

KILL

#include

int kill(pid_t pid, int sig);

这个函数的功能是将信号发送给进程或者进程组。

pid > 0  :要发送信号的进程号

pid = 0  :信号被发送到所以和当前进程在同一个进程组的进程

pid = -1 : 信号发送给发送进程有权限向他们发送信号的系统上的所以进程

pid < -1 :信号发送给其进程组ID等于pid的绝对值

几个比较常用的信号

SIGIGN:忽略改信号

SIGDEF:采用系统默认方式处理信号

SIGCHLD:在一个进程终止或者停止时,将该信号发送给其父进程,父进程的wait函数通常用来捕捉这个信号

SIGINT:当用户按中断键(delete/ctrl+c)时将产生这个信号

SIGKILL:此信号可以用于杀死一个进程

SIGSTOP:这是个作业控制信号,用于停止一个进程   这个信号和SIGKILL是仅有的两个不能被捕获或忽略的信号

SYSUSR1/2:用户定义的信号,用于应用程序

程序演示

117835362_1_20171201111708383.gif

/*************************************************************************

> File Name: signal.c

> Author: he xingjie

> Mail: gxmshxj@163.com

> Created Time: Fri 25 Oct 2013 07:53:56 AM PDT

************************************************************************/

#include

#include

#include

void my_func(int sig_no){

if(sig_no == SIGUSR1)

printf("Receive SIGUSR1.\n");

if(sig_no == SIGUSR2)

printf("Receive SIGUSR2.\n");

if(sig_no == SIGINT)

printf("Receive SIGINT.\n");

}

int main(void)

{

if(signal(SIGUSR1, my_func) == SIG_ERR)

printf("can't catch SIGUSR1.\n'");

if(signal(SIGUSR2, my_func) == SIG_ERR)

printf("can't catch SIGUSR2.\n'");

if(signal(SIGINT, my_func) == SIG_ERR)

printf("can't catch SIGINT.\n'");

kill(getpid(),SIGINT);

while(1);

return 0;

}

117835362_1_20171201111708383.gif

当运行这个程序的时候,我们将会看到:Receive SIGINT.  然后程序不断在循环,如果我们按ctrl+c,将会输出:Receive SIGINT.

如果我们把程序放在后天运行,并且用 kill -USR1 pid。pid为那个进程的id,我们还将会看到Receive SIGUSR1.

参考资料

[1] UNIX环境高级编程

[2]  我们老师上课的课件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux信号机Linux操作系统一个非常重要的机制,它允许进程之间进行通信并且可以对进程进行控。下面是一个简单的Linux信号机实验: 1. 创建一个C语言程序,引用头文件signal.h。 2. 在主程序使用signal函数注册一个SIGINT信号处理函数。 3. 在SIGINT信号处理函数,使用printf函数输出一条消息并且退出。 4. 在主程序使用while循环不断等待用户输入。 5. 如果用户输入了Ctrl+C组合键,则会触发SIGINT信号,进而调用SIGINT信号处理函数。 6. 在SIGINT信号处理函数,输出一条消息并且退出。 下面是一个示例代码: ```c #include <stdio.h> #include <signal.h> void sigint_handler(int sig) { printf("Received SIGINT signal, exiting...\n"); exit(0); } int main() { signal(SIGINT, sigint_handler); while(1) { printf("Running...\n"); sleep(1); } return 0; } ``` 在该代码,我们首先定义了一个名为sigint_handler的函数,用于处理SIGINT信号。 然后在主程序使用signal函数将SIGINT信号与sigint_handler函数进行绑定。 接着在while循环不断输出一条消息,同时等待用户输入。 如果用户输入了Ctrl+C组合键,则会触发SIGINT信号系统会自动调用sigint_handler函数进行处理。 在sigint_handler函数,我们输出一条消息并且退出程序。 可以通过编译并运行该代码进行测试,当用户输入Ctrl+C组合键时,程序会输出一条消息并且退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值