目录
信号
进程间通信
进程间通信的几种常见方式:信号 管道 共享内存 消息队列 信号量集 套接字
信号的概念
一种标志,标志着有某种事件发生
信号是一种软中断机制
中断 ---- 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
指令就是开启光标显示。