- SIGPIPE : 管道终止信号,当写入无人读取的管道时产生该信号,默认终止进程。比如当客户端关闭时,服务端仍然往socket写入信息,系统会自动杀死进程造成崩溃,因此网络程序必须要接管该信号。
- SIGCHILD : 子进程结束或者结束的时候发送该信号。用于避免产生僵尸进程。
注 : 僵尸进程是一个早已经死亡的进程,但在进程表中仍然占有位置。
为什么会出现僵尸进程?
linux当子进程的结束的时候,他不会完全被销毁,因为父进程还要使用它的信息。因此父进程没有处理sigchild信号或者调用wait / waitpid()等待子进程结束,就会出现僵尸进程。
- SIGALRM : 定时器信号,以秒为单位,默认终止进程。
- SIGUSR1 / SIGUSR2 : 自定义,默认终止进程。
- SIGINT : 键盘输入的退出信号 (Ctrl + \ ) 。
- SIGQUIT :键盘输入的退出信号(Ctrl + C)。
- SIGHUP : 控制终端的挂起信号。
那么信号的发送方式有哪些呢?
- 键盘输入: ctrl + c , ctrl + \
- 简单方式 : signal(int sig, void (*func)(int));
#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;
void sighandle(int sig)
{
cout<<"recieved signal:"
<<sig
<<endl;
}
int main(int argc,char* argv[])
{
signal(SIGINT, sighandle);
signal(SIGQUIT, sighandle);
signal(SIGHUP, sighandle);
pause();
return 0;
}
- 高级方式: int sigaction(int sig, const struct sigaction* act, struct sigaction* oact);
#include<iostream>
#include<signal.h>
#include<unistd.h>
using namespace std;
void sighandler(int sig)
{
cout<<"recieved signal :"
<<sig
<<endl;
}
int main(int argc, char* argv[])
{
struct sigaction act, oact;
act.sa_handler = sighandler;
//将所有位置为1
sigfillset(&act.sa_mask);
act.sa_flags = 0
sigaction(SIGINT,&act,&oact);
pause();
return 0;
}