无名管道、有名管道、信号、信号处理

news/2025/2/25 16:52:07

1. 进程间通信(IPC)

进程间通信(IPC)是指在不同进程之间交换数据或信息的机制。常见的 IPC 方法包括:

1.1 管道(Pipe)
  • 无名管道(Anonymous Pipe)

    • 只能用于具有亲缘关系的进程间通信(如父子进程)。

    • 使用 pipe() 系统调用创建。

    • 特点:

      • 读操作:如果管道中有数据,则直接读取;如果没有数据,会阻塞等待。

      • 写操作:如果管道中有读端且未满,则直接写入;如果管道已满,会阻塞等待。

      • 如果管道中没有读端,写入数据会导致管道破裂(SIGPIPE 信号)。

  • 有名管道(Named Pipe/FIFO)

    • 可以用于任意两个进程之间的通信。

    • 使用 mkfifo() 系统调用创建。

    • 特点:

      • 必须读写两端同时打开,才能继续执行;否则会阻塞等待。

1.2 信号(Signal)
  • 定义

    • 提供一种内核层与用户层之间的通知机制。

    • 信号是一种软件中断,用于通知进程某些事件的发生。

  • 信号类型

    • SIGINT(2):中断信号(如 Ctrl+C)。

    • SIGQUIT(3):退出信号(如 Ctrl+\)。

    • SIGSEGV(11):段错误。

    • SIGPIPE(13):管道破裂。

    • SIGALRM(14):定时信号。

    • SIGCHLD(17):子进程结束。

    • SIGSTOP(19):停止进程。

    • SIGTSTP(20):挂起进程(如 Ctrl+Z)。

    • SIGIO(29):异步 I/O 信号。

  • 对信号的处理方式

    1. 忽略:信号来了,不处理该信号。

    2. 缺省:信号来了,按照默认的方式处理信号。

    3. 捕捉:信号来了,按照指定的方式处理信号。

    • 注意:SIGKILL(9)和 SIGSTOP(19)不能被忽略或捕捉。

  • 函数接口

    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);
    • 功能:修改信号的处理方式。

    • 参数:

      • signum:信号编号。

      • handler:信号处理方式(SIG_IGN 忽略,SIG_DFL 缺省)。

    • 返回值:

      • 成功返回之前的信号处理函数。

      • 失败返回 SIG_ERR

1.3 消息队列(Message Queue)
  • 提供一种在进程间传递消息的机制。

  • 消息队列允许一个或多个进程向队列中写入消息,同时允许一个或多个进程读取这些消息。

1.4 共享内存(Shared Memory)
  • 允许多个进程共享同一块内存区域。

  • 提供高效的进程间通信,但需要同步机制(如互斥锁)来避免数据竞争。

1.5 信号量(Semaphore)
  • 提供一种同步机制,用于控制对共享资源的访问。

  • 函数接口:

    int sem_init(sem_t *sem, int pshared, unsigned int value);
    int sem_destroy(sem_t *sem);
    int sem_wait(sem_t *sem);
    int sem_post(sem_t *sem);
    • sem_init:初始化信号量。

    • sem_destroy:销毁信号量。

    • sem_wait:申请信号量资源(资源数 - 1)。

    • sem_post:释放信号量资源(资源数 + 1)。

1.6 套接字(Socket)
  • 提供一种在不同主机上的进程之间进行通信的机制。

  • 支持多种协议(如 TCP/IP、UDP/IP)。


2. 管道的详细说明

2.1 无名管道
  • 创建

    int pipe(int pipefd[2]);
    • 功能:创建操作管道的两个文件描述符。

    • 参数:

      • pipefd[0]:读文件描述符。

      • pipefd[1]:写文件描述符。

    • 返回值:

      • 成功返回 0。

      • 失败返回 -1。

2.2 有名管道
  • 创建

    int mkfifo(const char *pathname, mode_t mode);
    • 功能:创建管道文件。

    • 参数:

      • pathname:管道文件名。

      • mode:权限。

    • 返回值:

      • 成功返回 0。

      • 失败返回 -1。


3. 信号的详细说明

3.1 信号处理
  • 信号列表

    • 使用 kill -l 命令查看所有信号。

    • 示例:

      1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
      6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
      11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  • 信号处理方式

    • 忽略SIG_IGN

    • 缺省SIG_DFL

    • 捕捉:自定义处理函数。

  • 示例代码

    #include <stdio.h>
    #include <signal.h>
    
    void handle_sigint(int sig) {
        printf("SIGINT signal received\n");
    }
    
    void handle_sigquit(int sig) {
        printf("SIGQUIT signal received\n");
    }
    
    int main() {
        signal(SIGINT, handle_sigint);  // 捕捉 SIGINT
        signal(SIGQUIT, handle_sigquit);  // 捕捉 SIGQUIT
    
        printf("Press Ctrl+C or Ctrl+\\ to test signals\n");
        while (1) {
            // 等待信号
        }
    
        return 0;
    }
3.2 定时信号
  • alarm()

    unsigned int alarm(unsigned int seconds);
    • 功能:定时 seconds 秒后给当前进程发送 SIGALRM 信号。

    • 参数:

      • seconds:秒数。

    • 返回值:

      • 成功返回之前定时剩余的秒数。

      • 如果之前没有定时返回 0。

3.3 发送信号
  • kill()

    int kill(pid_t pid, int sig);
    • 功能:向 pid 对应的进程发送 sig 信号。

    • 参数:

      • pid:目标进程的 PID。

      • sig:信号编号。

    • 返回值:

      • 成功返回 0。

      • 失败返回 -1。


4. 总结

  • 管道

    • 无名管道:用于具有亲缘关系的进程间通信。

    • 有名管道:用于任意两个进程之间的通信。

  • 信号

    • 提供内核层与用户层之间的通知机制。

    • 可以通过 signal() 设置信号处理方式。

  • 消息队列

    • 提供进程间传递消息的机制。

  • 共享内存

    • 提供高效的进程间通信,但需要同步机制。

  • 信号量

    • 提供同步机制,用于控制对共享资源的访问。

  • 套接字

    • 提供不同主机上的进程之间进行通信的机制


http://www.niftyadmin.cn/n/5865731.html

相关文章

一键快速打包提交发布命令行工具

最近闲着没事儿&#xff0c;自己开发了一个能够一键快速打包发布和推送GIT的命令行工具&#xff0c;目前以开源 GitHub地址 话不多说直接进入正题&#xff0c;欢迎大家前来使用 第一步&#xff1a; 执行以下命令&#xff0c;下载该工具 该工具支持使用 npm、pnpm、yarn 和 …

基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…

Spark MLlib中的机器学习算法及其应用场景

Spark MLlib是Apache Spark框架中的一个机器学习库&#xff0c;提供了丰富的机器学习算法和工具&#xff0c;用于处理和分析大规模数据。以下是Spark MLlib中的机器学习算法及其应用场景的详细描述&#xff1a; 一、Spark MLlib中的机器学习算法 分类算法&#xff1a; 逻辑回…

登上Nature子刊!因果机器学习起步A会!

2025深度学习发论文&模型涨点之——因果机器学习 传统机器学习方法多聚焦于关联关系的挖掘&#xff0c;对于变量之间深层次的因果关系却难以有效揭示。这种局限性在诸多复杂问题场景中逐渐凸显&#xff0c;促使学术界对能够突破这一瓶颈的新型方法展开深入探索&#xff0c;…

uniapp打包生产证书上架IOS全流程

第一步&#xff1a;生成生产证书 上传CSR文件&#xff0c;windows系统电脑无法上传csr文件可以参考这个&#xff1a; windows下创建ios打包证书的详细流程_香蕉云编 下载生产证书 下载下来的cer生产证书在香蕉云编cer文件上传栏上传&#xff0c;然后生成p12文件 生成p12文件…

14.12 Auto-GPT OutputParser 架构设计:构建安全可控的大模型输出管道

Auto-GPT OutputParser 架构设计:构建安全可控的大模型输出管道 关键词:Auto-GPT 输出解析、结构化响应控制、内容安全过滤、多格式输出适配、错误恢复机制 1. OutputParser 的核心作用与设计挑战 输出解析的三大核心任务: #mermaid-svg-sUqVk51rX50EHefe {font-family:&q…

在 JavaScript 中,[](空数组)不是假值,它是“真值”(truthy)

文章目录 语法解释!this.form.productPhotos 的含义在代码中的作用具体判断 实际上下文总结当前代码的局限 在你的父组件代码中&#xff0c;出现了 !this.form.productPhotos 这样的表达式&#xff0c;具体是在 handleSubmit 方法中&#xff1a; private handleSubmit() {if (…

C语言基础学习指南第二章:核心语法与函数——从函数定义到实战项目,助你快速掌握C语言核心能力

目录 1. 函数的定义与调用 2. 数组与字符串操作 3. 指针基础 4. 动态内存管理 5. 综合项目实战 1. 函数的定义与调用 1.1 函数的基本结构 函数由返回值类型、函数名、参数列表和函数体组成。例如&#xff1a; int get_max(int x, int y) { return (x > y) ? x : y; …