Linux信号

 目录

 信号

进程间通信

信号的概念

查看信号

信号的产生

信号的处理

信号的 API 函数

函数名:kill()

函数名:raise()

函数名:alarm()

函数名:pause()

函数名:signal()

wait()补充---检测进程退出状态

函数名:atexit()


信号

进程间通信

进程间通信的几种常见方式:信号 管道 共享内存 消息队列 信号量集 套接字

信号的概念

一种标志,标志着有某种事件发生

信号是一种软中断机制

        中断 ---- mcu 软件中断 硬件中断

查看信号

kill -l 

信号一共有 64 个值,实际只有 62 个

前 31:沿用 unix 的

后 31:Linux 发展新增的

了解一下这几个信号:

2 SIGINT-中断信号 Ctrl + C

3 SIGQUIT- 退出信号 Ctrl + \

9 SIGKILL - 强制终止

14 SIGALRM -闹钟信号  当alarm函数设置的定时器超时后,会发送SIGALRM信号给进程。

17 SIGCHLD - 子进程状态改变信号  子进程改变状态时,父进程会收到SIGCHLD信号。

18 SIGCONT - 继续运行信号 恢复SIGSTOP的进程

19 SIGSTOP - 暂停信号

20 SIGTSTP - 终端暂停信号 Ctrl + Z

信号的产生

kill -9

ctrl c

ctrl z

ctrl \

API 函数

信号的处理

默认处理---结束进程

忽略处理---当作信号没发生

自定义处理---调用信号处理函数

信号的 API 函数

函数名:kill()

头文件:

#include<sys/types.h>

#include<signal.h>

函数原型:int kill(pid_t pid, int sig);

函数功能:向指定进程发送信号

函数参数:

pid_t pid:指定进程的 PID

int sig:信号编号或名

函数返回值:成功返回 0,失败返回-1

函数使用:

kill(pid,9);
kill(pid,SIGKILL);
kill(pid,19);
kill(pid,18);

函数名:raise()

头文件:#include <signal.h>

函数原型:int raise(int sig);

函数功能:向进程自身发送信号

函数参数:int sig:信号编号或名

函数返回值:成功返回 0,失败返回-1

函数使用:

raise(9);

函数名:alarm()

头文件:#include<unistd.h>

函数原型:unsigned int alarm(unsigned int seconds);

函数功能:向进程自身发送一个闹钟信号

函数参数:unsigned int seconds:定时的秒数

函数返回值:如果 alarm 函数是第一次被调用,返回 0

如果不是第一次被调用,返回的是上一次剩余的时间

函数使用: 多次调用的情况下闹钟时间并不会叠加,而是覆盖

alarm(10);

函数名:pause()

头文件:#include <unistd.h>

函数原型:int pause(void);

函数功能:阻塞当前进程,直到收到一个信号,并且完成对信号的相关操作后,解除阻塞

函数参数:无

函数返回值:当进程被一个信号中断并完成了对该信号的相关处理后,pause()函数会返回 -1 。同时,会将全局变量errno设置为EINTR(表示函数被中断),以指示函数是由于接收到信号而提前返回,而非正常完成阻塞操作

函数名:signal()

头文件:#include<signal.h>

函数原型:typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);

函数功能:信号改造函数,将信号原本的功能改变为别的功能

函数参数: int signum:信号

sighandler_t handler:信号处理函数

函数返回值:信号处理函数

函数使用:

默认处理:signal(信号,SIG_DFL);

忽略处理:signal(信号,SIG_IGN);

自定义处理:signal(信号,函数名);

函数格式固定:

 void XXX(int XX) 
{ 
    xxxxxxx; 
    xxxxxx;
    xxxxx; 
    … 
}

wait()补充---检测进程退出状态

WIFEXITED(wstatus)

如果返回值为真,代表正常结束

如果返回值为假,代表异常结束

函数名:atexit()

函数原型:int atexit(void (*function)(void));

函数功能:进程注册清理函数

函数参数:void (*function)(void):清理函数的函数名

函数返回值:成功返回 0,失败返回非 0

函数使用:

void FUNC(void){
    kill(pid,9);
    system("stty echo");
    printf("\033[?25h");
}
int main(){
    atexit(FUNC);
    ...
}

其中:

system("stty echo");

  • 作用:开启终端字符回显功能。比如输入字符能在屏幕显示出来,之前可能因某些操作关闭了回显,这行代码就恢复正常显示输入内容。

  • 原理:system()函数执行stty echo这个 shell 命令,stty用于设置终端属性,echo参数是开启回显。

printf("\033[?25h");

  • 作用:在终端显示光标。可能之前隐藏了光标,用这行代码能让光标重新出现以便正常输入等操作。

  • 原理:用 ANSI 转义序列控制终端显示,\033是开始标识,[?25h指令就是开启光标显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值