进程信号之signal系统调用
目录
函数原型
作用
参数讲解
返回值
示例代码
函数原型
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
作用
系统中的信号都有其默认的处理方式,例如通过ctrl+c发送给进程的信号SIGINT默认行为是终止进程。signal系统调用用于改变信号的处理方式,使大家可以自定义信号的处理方式。后续会为大家举例说明。
参数讲解
signum
:指定要设置处理方式的信号编号。常见的信号有:SIGINT
:中断信号,通常由用户在终端按下Ctrl + C
产生,用于请求进程中断当前操作。SIGTERM
:终止信号,用于请求进程正常终止,进程可以捕获并处理这个信号以进行清理工作。SIGKILL
:杀死信号,用于强制终止进程。该信号不能被捕获、阻塞或忽略。SIGSEGV
:段错误信号,当进程试图访问无效内存地址(如空指针、越界指针等)时会收到此信号。
handler
:一个函数指针,指向处理信号的函数。这个函数只有一个int
类型的参数,该参数表示接收到的信号编号。
返回值
signal
函数返回之前为 signum
信号设置的处理函数指针。如果调用失败,返回 SIG_ERR
并设置 errno
以指示错误原因。常见的错误包括无效的信号编号等。
示例代码
#include <stdio.h>
#include <signal.h>
#include <unistd.h>// 自定义信号处理函数
void my_handler(int signum) {printf("Received signal %d\n", signum);// 这里可以添加更多的处理逻辑,如清理资源
}int main() {// 设置SIGINT信号的处理函数if (signal(SIGINT, my_handler) == SIG_ERR) {perror("signal");return 1;}printf("Press Ctrl + C to send SIGINT...\n");while (1) {sleep(1);}return 0;
}
- 程序开始执行,打印"Press Ctrl + C to send SIGINT...\n"
- 进入无限循环
- 按下Ctrl + C向进程发送SIGINT信号
- signal捕捉SIGINT信号
- 进入为SIGINT信号自定义的信号处理逻辑,打印"Received signal 2"
注意由于SIGINT信号已经被捕捉,顾ctrl + c已经无法终止该进程。想要终止该进程应当先ps -aux查看进程pid,然后kill -9 pid杀死该进程。或者直接关闭xshell,关闭xshell后,会给此次会话的全部进程(除了守护进程都发送一个终止信号),然后进程退出,最后重新连接即可。
想要了解关于会话的基础理论,可以看通俗易懂linux环境变量-CSDN博客中的第一部分“会话大致是什么?"即可。