进程间的通信(信号通信)

进程间的通信(信号通信)

进程的信号通信是操作系统中进程间通信(IPC)的一种方式,它允许一个进程向另一个进程发送一个信号,从而改变另一个进程的状态或执行某个操作。信号是异步的,意味着信号的发送和接收并不依赖于接收进程的执行状态。

信号通信的基本概念

  1. 信号类型:操作系统定义了一系列的信号,如SIGINT(由中断字符(通常是Ctrl+C)产生)、SIGTERM(请求终止程序)、SIGSEGV(非法内存访问)等。
  2. 信号处理函数:进程可以指定一个信号处理函数来响应某个信号。当信号被发送时,操作系统会中断接收进程的执行,并调用相应的信号处理函数。
  3. 发送信号:进程可以使用kill系统调用来向另一个进程发送信号。进程还可以使用raise系统调用来给自己发送信号。
  4. 信号阻塞:进程可以选择阻塞某些信号,即暂时不接收这些信号。

发送信号(使用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,作者将及时改正,欢迎与各位老爷交流讨论。

麻烦三连加关注!!!!

比心

posted @   琨为玉也  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示