无名管道PIPE,进行父子双进程的“双向通信”
更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
本篇记录应用无名管道PIPE,进行父子双进程的“双向通信”,并当某一方收到/发送“quit”马上结束通信,具体代码如下:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/wait.h>int main()
{int status;char buf[50]; //read/write用于存放字符串int fd1[2]; //用于存放管道1的两个文件描述符int fd2[2]; //用于存放管道2的两个文件描述符if(pipe(fd1) == -1) //创建管道1,并将文件描述符放进fd1[2]中{perror("pipe()");exit(1);}if(pipe(fd2) == -1) //创建管道2,并将文件描述符放进fd2[2]中{perror("pipe()");exit(1);}pid_t id = fork(); //创建一个子进程if(id > 0) //父进程{while(1){bzero(buf,50);read(fd1[0],buf,50); //父进程从管道1读取信息if(strcmp(buf,"quit") == 0){write(fd2[1],buf,50); //父进程从管道2写入信息break;}printf("父进程:我收到:%s\n\n",buf);bzero(buf,50);printf("回复子进程:");scanf("%s",buf);write(fd2[1],buf,50); //父进程从管道2写入信息}}else if(id == 0) //子进程{while(1){bzero(buf,50);printf("发给父进程:");scanf("%s",buf);write(fd1[1],buf,50); //子进程从管道1写入信息bzero(buf,50);read(fd2[0],buf,50); //子进程从管道2读取信息if(strcmp(buf,"quit") == 0){write(fd1[1],buf,50); //子进程从管道1写入信息break;}printf("子进程:我收到:%s\n\n",buf);}exit(0); //退出子进程}pid_t otherid=waitpid(id,&status,0);//阻塞等待close(fd1[0]);close(fd1[1]);close(fd2[0]);close(fd2[1]);
}
运行结果:
无名管道PIPE,进行父子双进程的“双向通信”相关推荐
- 有名管道FIFO,进行双进程的“双向通信”
更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 本篇记录应用有名管道FIFO,进行双进程的"双向通信" ...
- 通过单管道(pipe)实现两个进程间双向通信
用例: #include <stdio.h> #include <unistd.h>#define BUF_SIZE 30int main(int argc, char con ...
- pipe 半双工_linux进程间通讯之管道(无名管道pipe)实现全双工双向通讯
管道是什么: 1. 管道只能用于具备亲缘关系的进程之间通讯. 2.管道是一种单工或者说半双工的通讯方式,传递信息的方向是固定的,只能由一端传递到另外一端. 头文件及函数原型: #include int ...
- linux进程间通信:无名管道 pipe
文章目录 内核层实现 结构 通信原理 特点 使用 函数声明 使用实例 单向通信 双向通信 编程注意事项 管道中无数据时读操作会阻塞 将管道的写端句柄关闭,不会影响读端数据读取 管道中没有数据,写操作关 ...
- Linux内核中无名管道pipe和有名管道fifo的分析
1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...
- linux系统调用创建无名管道,linux 无名管道pipe和有名管道FIFO
1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...
- 无名管道pipe使用方法
有名管道pipe函数:int pipe(int filedes[2]); 下面程序通过创建进程,父进程写入数据,子进程读取数据,从管道中读取数据. #include <stdio.h> ...
- 无名管道(PIPE)与 有名管道(FIFO)
更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 无名管道(PIPE)部分: (1)无名管道的创建: 头文件: #incl ...
- 无名管道-----实现父子进程相互通信
创建一条无名管道并且给你两个文件描述符(读写的文件描述符) pipefd[0]:读端 pipefd[1]:写端 思路: 只需要一个.c即可,fork一次即可(因为用的是无名管道) 注意: 父进程: 发 ...
最新文章
- 在读研、竞赛和实习中追求平衡
- Day 14 保护环境的建议
- MongoDB应用篇(转)
- SpringMVC的请求-文件上传-单文件上传的代码实现1
- Unsupported Hardware Detected
- Spring 事务初始化源码分析
- 对于一组给定的叶子结点_高糊图片可以做什么?Goodfellow等人用它生成一组合理图像...
- MySQL(6)--- 创建数据库
- mysql doc插入数据_如何向MySQL数据库的表中录入数据.doc
- 关于循环经济的三维展示
- Atitit 数据库的历史与未来 目录 1.1. 两个对于数据库强需求的行业。电信 金融	1 1.2. 艾提拉分析 对数据库强需求行业金融	1 2. 数据库历史	2 2.1. ,上个世纪50,6
- Python爬虫实战之抓取猫眼电影
- elasticsearch search timeout机制
- C语言教程(四):基础知识(最后一续)
- C#编程,Lazy(延迟初始化)用法
- 【数学模拟卷总结】2023李林六套卷数学二第三套
- python的scipy简介
- 南信与南邮谁的计算机专业更强,南信力压南邮!关于一流本科专业!
- php高德地图手机定位,AMap3DMap_Demo
- LOAM、LEGO-LOAM与LIO-SAM的知识总结