进程间的通信(信号通信)
进程间的通信(信号通信)
进程的信号通信是操作系统中进程间通信(IPC)的一种方式,它允许一个进程向另一个进程发送一个信号,从而改变另一个进程的状态或执行某个操作。信号是异步的,意味着信号的发送和接收并不依赖于接收进程的执行状态。
信号通信的基本概念
- 信号类型:操作系统定义了一系列的信号,如SIGINT(由中断字符(通常是Ctrl+C)产生)、SIGTERM(请求终止程序)、SIGSEGV(非法内存访问)等。
- 信号处理函数:进程可以指定一个信号处理函数来响应某个信号。当信号被发送时,操作系统会中断接收进程的执行,并调用相应的信号处理函数。
- 发送信号:进程可以使用
kill
系统调用来向另一个进程发送信号。进程还可以使用raise
系统调用来给自己发送信号。 - 信号阻塞:进程可以选择阻塞某些信号,即暂时不接收这些信号。
发送信号(使用kill
)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int main() {
pid_t pid; // 目标进程的PID
// 假设我们有一个进程ID为target_pid的进程
pid = 12345; // 替换为实际的进程ID
// 发送SIGTERM信号给目标进程
if (kill(pid, SIGTERM) == -1) {
perror("kill");
exit(EXIT_FAILURE);
}
printf("SIGTERM信号已发送给进程%d\n", pid);
return 0;
}
接收信号并处理(设置信号处理函数)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
// 信号处理函数
void handle_sigterm(int signum) {
printf("接收到信号%d,开始清理并退出...\n", signum);
// 在这里执行清理操作,如关闭文件、释放资源等
exit(0); // 退出程序
}
int main() {
// 设置SIGTERM信号的处理函数
if (signal(SIGTERM, handle_sigterm) == SIG_ERR) {
perror("signal");
exit(EXIT_FAILURE);
}
// 模拟进程正在运行
while (1) {
printf("进程正在运行...\n");
sleep(1);
}
return 0;
}
在这个例子中,我们首先定义了一个信号处理函数handle_sigterm
,它会在接收到SIGTERM
信号时被调用。然后,我们使用signal
函数将SIGTERM
信号的处理函数设置为handle_sigterm
。最后,我们进入一个无限循环来模拟进程正在运行。当SIGTERM
信号被发送到该进程时,handle_sigterm
函数会被调用,然后程序会执行清理操作并退出。
如果代码用法有什么问题,请将问题发至网易邮箱 m17872844806@163.com,作者将及时改正,欢迎与各位老爷交流讨论。
麻烦三连加关注!!!!
比心
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!