概念:
系统在响应某些状况而产生的事件,进程在接收到信号后采取相应的动作。
产生信号的方式:
1.键盘事件
Ctrl + c → 2) SIGINT(终止/中断) "INT" ----Interrupt
Ctrl + z → 20) SIGTSTP(暂停/停止) "T" ----Terminal 终端。
? Ctrl + → 3) SIGQUIT(退出)
2.硬件异常产生指令
3.函数/命令产生信号
kill命令产生信号:kill -SIGKILL pid
kill函数:给指定进程发送指定信号
在linux中,输入 kill -l,会出现linux系统中信号的类别:
这就是信号的全部种类。其中1-31是普通信号,34以后是实时信号。
信号的处理方式:
信号分类:
信号不排队。在某一时刻,几个信号传递过来的时候并没有处理完,导致了某些信号的丢失。
注册信号:
void (*signal(int signum, void(*pf)(int)))(int); void (*pf)(int); //自定义的函数处理
发送信号:
kill(pid_t pid, int signum);
pid_t说明:
singnum代表信号编号,参照上方kill -l显示的信号
返回值:
执行成功则返回0,失败返回-1。
错误码:
EINVAG:参数sig不合法。
ESRCH:参数pid所指定的进程或进程组不存在。
EPERM:权限不够无法传送给指定进程。
实例一:
注册和发送信号:
/*register.c*/ #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<signal.h> #include<sys/types.h> void handler(int s) { printf("recv %d\n", s); exit(0); } int main() { signal(SIGUSR1, handler); pid_t pid; pid = fork(); if (pid == 0) { sleep(3); kill(getppid(), SIGUSR1); //getppid()获取父进程进程号 } else { for( ; ;) { printf("1"); fflush(stdout); sleep(1); } } return 0; }
运行结果:
ubuntu@ubuntu:~/wangqinghe/signal$ ./register
1111recv 10
原文:https://www.cnblogs.com/wanghao-boke/p/12116712.html