进程间的通信(信号通信)
进程的信号通信是操作系统中进程间通信(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
函数会被调用,然后程序会执行清理操作并退出。
如果代码用法有什么问题,请将问题发至网易邮箱 [email protected],作者将及时改正,欢迎与各位老爷交流讨论。
麻烦三连加关注!!!!
比心
标签:pid,通信,发送,信号,进程,SIGTERM,include From: https://www.cnblogs.com/zkbklink/p/18233593