进程间通信(1)-管道

news/发布时间2024/5/3 6:46:07
匿名管道(Anonymous Pipe)和有名管道(Named Pipe,也称为FIFO)是两种不同的进程间通信方式,它们有以下主要区别:
  1. 命名和使用方式:
  • 匿名管道没有名字,只能在具有亲缘关系的进程之间使用,通常是在调用pipe()函数后直接使用,无需其他步骤。
  • 有名管道有一个文件名,它在文件系统中有一个路径,不限于亲缘关系的进程之间使用,可以通过文件系统路径来访问。它们由mkfifo()函数创建,并可以通过文件系统进行访问。
  1. 持久性:
  • 匿名管道在创建它们的进程终止时自动销毁,因此只存在于创建它们的进程生命周期内。
  • 有名管道在文件系统中存在,即使创建它们的进程终止,它们也可以被其他进程访问,直到显式地被删除或文件系统卸载。
  1. 通信方式:
  • 匿名管道只能支持单向通信,通常是用于父子进程之间的通信。
  • 有名管道支持双向通信,可以被不相关的进程之间使用。
  1. 进程间关系:
  • 匿名管道通常用于具有父子关系的进程间通信,因为它们是通过fork()创建的子进程继承的。
  • 有名管道可以用于任意两个进程间的通信,只要它们能够访问相同的有名管道文件。
 

匿名管道demo如下:

pipefd[0]只读不写,pipefd[1]只写不读
#include <stdlib.h>
#include <unistd.h>#define BUFFER_SIZE 25int main() {char buffer[BUFFER_SIZE];int pipefd[2]; // 用于存放管道的文件描述符,pipefd[0]表示读取端,pipefd[1]表示写入端
    pid_t pid;// 创建管道if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}// 创建子进程pid = fork();if (pid < 0) {perror("fork");exit(EXIT_FAILURE);}if (pid > 0) { // 父进程close(pipefd[0]); // 关闭读取端,父进程只负责写入数据
printf("Parent process is writing to the pipe...\n");write(pipefd[1], "Hello from parent process!", 26);close(pipefd[1]); // 写入完成后关闭写入端} else { // 子进程close(pipefd[1]); // 关闭写入端,子进程只负责读取数据
printf("Child process is reading from the pipe...\n");read(pipefd[0], buffer, BUFFER_SIZE);printf("Child process received: %s\n", buffer);close(pipefd[0]); // 读取完成后关闭读取端
    }return 0;
}
执行结果如下:
0
 
 

有名管道demo如下:

进程1:写入数据到有名管道
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>#define BUFFER_SIZE 25
#define FIFO_FILE "/tmp/myfifo"int main() {char buffer[BUFFER_SIZE];int fd;// 创建有名管道mkfifo(FIFO_FILE, 0666);// 打开有名管道以写入数据fd = open(FIFO_FILE, O_WRONLY);if (fd == -1) {perror("open");exit(EXIT_FAILURE);}// 写入数据到管道printf("Process 1 is writing to the named pipe...\n");write(fd, "Hello from Process 1!", 21);printf("Process 1 wrote: Hello from Process 1!\n");// 关闭管道
    close(fd);return 0;
}

 

进程2:从有名管道读取数据
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>#define BUFFER_SIZE 25
#define FIFO_FILE "/tmp/myfifo"int main() {char buffer[BUFFER_SIZE];int fd;// 创建有名管道mkfifo(FIFO_FILE, 0666);// 打开有名管道以读取数据fd = open(FIFO_FILE, O_RDONLY);if (fd == -1) {perror("open");exit(EXIT_FAILURE);}// 从管道中读取数据printf("Process 2 is reading from the named pipe...\n");read(fd, buffer, BUFFER_SIZE);printf("Process 2 received: %s\n", buffer);// 关闭管道
    close(fd);return 0;
}

 

执行结果如下:
0
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/67533840.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

异常编译代码分析

异常编译代码分析 https://lowlevelbits.org/compiling-ruby-part-5/ 调用堆栈、堆栈帧和程序计数器 在程序执行期间,机器维护指向正在执行的指令的指针。它被称为程序计数器(或指令指针)。 当调用一个方法时,程序计数器被设置为被调用函数(被调用者)上的第一条指令。一旦…

Flask 框架启动无法改变端口

避坑! 相信大家使用flask框架的时候有时候会出现无法修改启动端口的情况. 在这里一共有两种解决办法(目前发现)1- 如果你使用的是flask Server 方式启动的你的项目的话, 可以Pycharm的环境变量中指定:FLASK_RUN_PORT=[PORT]2- 如果你使用的Python的话, 可以在代码中手动修改端口…

Java软件安装以及环境配置

Java软件安装以及环境配置 一、JDK安装 JDK官网:https://www.oracle.com/java/technologies/downloads/#java8 根据自己的电脑配置,安装对应平台,对应操作系统的JDK。 本人下载的是Windows x64版本的JDK。

defer 延迟调用【GO 基础】

本文通过示例代码讲解了 defer 的用法和值的注意的点。〇、前言 在 Go 语言中,defer 是一种用于延迟调用的关键字。 defer 在 Go 语言中的地位非常重要,它是确保资源正确释放和程序健壮性的关键字。 本文将通过示例对其进行专门的详解。 一、defer 简介 defer 的主要用途是在…

2024/4/3

1、今天中润稳步上涨,然后涨停,没有一字涨停或者高开低走,因为明天是清明假期,有连续四天的休市时间,因为怕夜长梦多的避险情绪,所以今天资金流出明显,尤其是小盘股和游资,导致今天很多股票炸板 所以假期之前一定要考虑好,除非前景大好,假期的消息预期可控且假期之前…

轻松玩转书生浦语大模型趣味 Demo——day2笔记

本节课有四个任务:学习部署、玩角色扮演的agent项目,玩数学运算agent、玩写作agent 主要学习过程就是跟着视频,复制学习文档里的资料,完成demo的使用。主要目的是熟悉开发平台。 视频: 轻松玩转书生浦语大模型趣味 Demo_哔哩哔哩_bilibili 资料: Tutorial/helloworld/he…