目录
1、信号
1.1 进程间通信
信号,管道,IPC(进程间通信):共享内存,消息队列,信号量集
套接字 -- 网络编程
线程----网络编程,数据库
1.2 信号的概念
属于一种软中断
查看信号:kill - I
62个信号
前31个属于不可靠信号
后31个属于可靠信号
ctrl + c 2号信号 -- 杀死进程
ctrl + \ 3号信号 -- 杀死进程
9号信号 -- 杀死进程
信号的产生:
用户:ctrl + c ctrl + \ kill-sig PID 参数信号
内核:当我们的程序出现一些错误的时候,比如段错误,内核会给我们的进程发生杀死当前进程的信号。
程序:通过函数发送信号:kill
1.3 信号相关API
1.3.1kill -- 给某一个进程发送信号
头文件:
#include <sys/types.h>
#include <signal.h>
函数原型:int kill(pid_t pid, int sig);
形参:pid -- 给那个进程发送信号
sig-- 信号(可以写序号,也可以写后面的宏定义)
返回值:成功返回0,失败返回-1
特殊信号:
9 -- SIGKILL -- 杀死进程,不可以被忽略或者改造;
14 -- SIGALRM -- 闹钟信号,杀死进程
17 -- SIGCHLD -- 只要子进程状态发生改变,父进程就能接收到该信号
18 -- SIGCONT -- 恢复被19号暂停的进程
19 -- SIGSTOP -- 暂停进程
1.3.2 raise -- 给自己发送信号
头文件:
#include <signal.h>
函数原型:int raise(int sig);
等价于:kill(getpid(),sig)
1.3.3 alarm
头文件:#include <unistd.h>
函数原型:unsigned int alarm(unsigned int seconds);
形参:seconds 秒数
功能:设置闹钟,闹钟时间到,产生闹钟信号,闹钟信号,可以杀死当前进程。
如果在该alarm之前,已经设置过闹钟,此时闹钟会更新
返回值:如果上一次设置的有闹钟,返回上一个闹钟的剩余时间,否则返回0;
1.3.4 pause
只要运行,就阻塞,直到一个信号产生,才会解除阻塞。
头文件:#include <unistd.h>
函数原型:int pause(void);
1.3.5 signal
信号处理函数
头文件:#include <signal.h>
函数原型:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
形参:signum -- 要处理的信号
handler -- SIG_DFL -- 默认处理
-- SIG_IGN -- 忽略处理
-- 函数指针 -- 捕获到该信号,执行函数指针对应的函数
具体用法:signal(2,SIG_DFL);默认处理
signal (2,SIG_IGN); 忽略处理
signal(信号,FUN); 捕捉到信号,执行Fun函数
注意:9号,19号,不允许被忽略,也不允许被改造
补充:
atexit: 注册退出清理函数
头文件:#include <stdlib.h>
函数原型:int atexit(void (*function)(void));
形参: 函数指针
void Clean(void)
{
printf(“%s 被运行\n”,__FUNCTION__);
}
int main()
{
atexit(Clean);//注册退出清理函数, 在 main 函数退出的时候, 直到自动运行 Clean 函数
}