首页 > 系统相关 >进程通信--管道(存在于内核区)

进程通信--管道(存在于内核区)

时间:2024-05-22 10:54:36浏览次数:14  
标签:-- pipefd 管道 fd 内核 进程 include buf

在Linux中,管道(pipe)是一种用于进程间通信(IPC)的机制,它允许数据在两个进程之间单向传输。管道有两种类型:匿名管道和命名管道(FIFO)。

匿名管道

匿名管道通常用于具有父子关系的进程之间的通信。它由 pipe() 系统调用创建。匿名管道只存在于创建它的进程及其子进程之间。匿名管道创建后,生成一对文件描述符,一个用于读取,另一个用于写入。

以下是使用匿名管道进行父子进程间通信的示例:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    int pipefd[2];
    pid_t cpid;
    char buf;

    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    cpid = fork();
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (cpid == 0) {    /* 子进程 */
        close(pipefd[1]);    /* 关闭写端 */

        while (read(pipefd[0], &buf, 1) > 0) {
            write(STDOUT_FILENO, &buf, 1);
        }

        write(STDOUT_FILENO, "\n", 1);
        close(pipefd[0]);
        _exit(EXIT_SUCCESS);

    } else {            /* 父进程 */
        close(pipefd[0]);    /* 关闭读端 */
        const char *msg = "Hello from parent";
        write(pipefd[1], msg, strlen(msg));
        close(pipefd[1]);    /* 关闭写端 */
        wait(NULL);          /* 等待子进程 */
        exit(EXIT_SUCCESS);
    }
}

命名管道(FIFO)

命名管道可以在无亲缘关系的进程之间进行通信。它在文件系统中存在,使用 mkfifo 命令或 mkfifo() 系统调用创建。命名管道通过路径名进行访问。

以下是使用命名管道进行进程间通信的示例:

  1. 创建命名管道(通常在 shell 中执行):

    mkfifo /tmp/myfifo
    
  2. 写入进程(writer.c):

    #include <fcntl.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        const char *fifo_path = "/tmp/myfifo";
        const char *msg = "Hello from writer";
        int fd = open(fifo_path, O_WRONLY);
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }
    
        write(fd, msg, strlen(msg));
        close(fd);
        return 0;
    }
    
  3. 读取进程(reader.c):

    #include <fcntl.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        const char *fifo_path = "/tmp/myfifo";
        char buf[128];
        int fd = open(fifo_path, O_RDONLY);
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }
    
        ssize_t num_bytes = read(fd, buf, sizeof(buf) - 1);
        if (num_bytes == -1) {
            perror("read");
            exit(EXIT_FAILURE);
        }
    
        buf[num_bytes] = '\0';  // Null-terminate the string
        printf("Read from FIFO: %s\n", buf);
        close(fd);
        return 0;
    }
    

代码编译和运行

  1. 编译代码:

    gcc writer.c -o writer
    gcc reader.c -o reader
    
  2. 运行写入进程:

    ./writer
    
  3. 在另一个终端窗口运行读取进程:

    ./reader
    

总结

  • 匿名管道:适用于父子进程间的通信,使用 pipe() 系统调用创建。
  • 命名管道(FIFO):适用于无亲缘关系的进程间通信,使用 mkfifo 命令或 mkfifo() 系统调用创建。

通过管道,进程可以高效地进行数据传输,实现进程间的协同工作。

标签:--,pipefd,管道,fd,内核,进程,include,buf
From: https://www.cnblogs.com/whcjob/p/18205737

相关文章

  • 【FAQ】HarmonyOS SDK 闭源开放能力 —IAP Kit(2)
    1.问题描述:应用内支付IAPKit和PaymentKit的区别以及适用场景?解决方案:IAPKit是四方支付,仅支持在线虚拟商品,如会员,游戏钻石等,双框架支持全球,目前单框架暂时只支持国内。Paymentkit是三方支付机构的方式,支持多样化的支付场景,主要支持实物商品,如具体的手机,电脑等,仅支持国内。......
  • el-calendar的使用
    使用场景:需要每天显示不同的内容,当天的可以进行更改,且只可以更改当天的,可以切换月份问题1:月份可以进行更改<el-calendarv-model="calendarValue"><templateslot="dateCell"slot-scope="{date,data}">&......
  • LLM相关损失函数
    信息熵:信息熵torch代码event={'a':2,'b':2,'c':4}#信息熵分:1.5event2={'a':1,'b':1,'c':1}#信息熵分:1.585p_e=[v/sum(event.values())forvinevent.values()]en_e=[item*torch.log2(......
  • 填涂颜色
    传送锚点:https://www.luogu.com.cn/problem/P1162血色先锋队题目描述由数字\(0\)组成的方阵中,有一任意形状的由数字\(1\)构成的闭合圈。现要求把闭合圈内的所有空间都填写成\(2\)。例如:\(6\times6\)的方阵(\(n=6\)),涂色前和涂色后的方阵如下:如果从某个\(0\)出发,只向上下......
  • 进程通信--内存映射区(用户区)
    在进程间通信(IPC)中,内存映射区(Memory-MappedArea或Memory-MappedFile)是一种高效的通信机制,通过共享内存实现进程间的数据交换。使用内存映射区的主要优点是,它允许不同进程访问同一个物理内存区域,而不需要显式的数据拷贝。内存映射区的概念内存映射区是将文件或设备的内容映射......
  • 全面了解网络性能监测与流量分析
    当前数字化时代,网络系统的复杂性与日俱增,网络性能监测和流量分析已成为网络管理的关键所在。本文将从多个角度为您剖析网络性能监测和流量分析的精髓,助您深入了解网络的运行脉搏。网络性能监测:把握关键指标网络性能监测涉及多个重要方面:带宽监控及时掌握网络带宽使用状况......
  • 接口测试用例设计的关键步骤与技巧解析
    简介接口测试在需求分析完成之后,即可设计对应的接口测试用例,然后根据用例进行接口测试。接口测试用例的设计也需要用到黑盒测试用例设计方法,和测试流程与理论章节的功能测试用例设计的方法类似,设计过程中还需要增加与接口特性相关的测试用例。接口测试流程接口测试的质量目标......
  • 主流原型设计工具概览
    当代主流原型设计工具概览在数字产品开发领域,原型设计是至关重要的一步。它不仅帮助设计师和开发团队可视化产品概念,还能在产品开发周期的早期阶段发现潜在问题。随着技术的发展,市面上涌现出许多优秀的原型设计工具,它们各有特点,适用于不同的设计需求和工作流程。本文将介绍几种主......
  • word替换快捷操作
    Sub替换词语()DimdocAsDocumentDimfindTextAsStringDimreplaceTextAsString'设置第一个要查找和替换的文本findText="机构管理"replaceText="部门管理"'获取当前活动文档Setdoc=ActiveDocument'开始第一个查找和替换......
  • mysql 分组加行号
    mysql示例SELECTcasewhen@currentid<>t.idthen@rownum:=1else@rownum:=@rownum+1endASrow_num,casewhen@currentid<>t.idthen@currentid:=t.idelse@currentidendASrow_num,ID,......