环境:Vmware Workstation;CentOS-6.4-x86_64

说明:

对讲机模式:一个进程输入完成一句话,必须等待第二个进程输入完成一句话之后才能再次输入。

步骤:

1、创建两个管道:

[negivup@negivup mycode]$ mkfifo fifo1
[negivup@negivup mycode]$ mkfifo fifo2
[negivup@negivup mycode]$ ls
fifo1  fifo2

2、编写makefile文件:

.SUFFIXES:.c .oCC=gccSRCS1=readfifo.c
OBJS1=$(SRCS1:.c=.o)
EXEC1=readfifoSRCS2=writefifo.c
OBJS2=$(SRCS2:.c=.o)
EXEC2=writefifostart: $(OBJS1) $(OBJS2)$(CC) -o $(EXEC1) $(OBJS1)$(CC) -o $(EXEC2) $(OBJS2)@echo "--------------------------OK------------------------".c.o:$(CC) -Wall -o $@ -c $<clean:rm -rf $(OBJS1) $(EXEC1)rm -rf $(OBJS2) $(EXEC2)

3、编写读取管道的源文件readfifo.c:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>int main(void)
{pid_t pid = fork(); //创建了两个进程,父子关系if (pid > 0) //在主进程里面{int fd1 = open("fifo1", O_WRONLY);if (fd1 == -1){printf("open fifo1 error, %s\n", strerror(errno));return -1;}char buf[1024];while (1){memset(buf, 0, sizeof(buf));read(STDIN_FILENO, buf, sizeof(buf));write(fd1, buf, strlen(buf));}close(fd1);} else{int fd1 = open("fifo2", O_RDONLY);if (fd1 == -1){printf("open fifo2 error, %s\n", strerror(errno));return -1;}char buf[1024];while (1){memset(buf, 0, sizeof(buf));read(fd1, buf, sizeof(buf));printf("%s", buf);}close(fd1);}return 0;
}
4、编写写入管道的源文件writefifo.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>int main(void)
{pid_t pid = fork(); //创建了两个进程,父子关系if (pid > 0) //在主进程里面{int fd1 = open("fifo2", O_WRONLY);if (fd1 == -1){printf("open fifo2 error, %s\n", strerror(errno));return -1;}char buf[1024];while (1){memset(buf, 0, sizeof(buf));read(STDIN_FILENO, buf, sizeof(buf));write(fd1, buf, strlen(buf));}close(fd1);} else{int fd1 = open("fifo1", O_RDONLY);if (fd1 == -1){printf("open fifo1 error, %s\n", strerror(errno));return -1;}char buf[1024];while (1){memset(buf, 0, sizeof(buf));read(fd1, buf, sizeof(buf));printf("%s", buf);}close(fd1);}return 0;
}

5、编译并执行readfifo:

[negivup@negivup mycode]$ make
gcc -Wall -o readfifo.o -c readfifo.c
gcc -Wall -o writefifo.o -c writefifo.c
gcc -o readfifo readfifo.o
gcc -o writefifo writefifo.o
--------------------------OK------------------------
[negivup@negivup mycode]$ readfifo 

6、打开一个新的终端,执行writefifo:

[negivup@negivup mycode]$ writefifo
safd

这样就实现了两个进程之间的自由通信了。

需要特别注意的是,一个管道的一端,如果确定是读取的操作,那么就不能写入;同理,如果确定是写入的操作,就不能读取。

PS:根据传智播客视频学习整理得出。

Linux下的有名管道(06)---使用两个管道实现两个进程之间的通信(手机模式)相关推荐

  1. Linux下安装Docker,报错docker: unrecognized service的两种解决方案

    Linux下安装Docker,报错docker: unrecognized service的两种解决方案 参考文章: (1)Linux下安装Docker,报错docker: unrecognized ...

  2. Linux 进程及进程之间的通信机制——管道

    参考: LInux C编程从初学到精通 电子工业出版社 Linux 进程 Linux 进程简介 Linux是一个多用户多任务的操作系统,多用户是指多个用户可以在同一时间使用同一台计算机系统:多用户是指 ...

  3. linux:进程之间的通信

    ipc :进程间通信(InterProcess Communication) 1.管道 同一时间是单向的:父读子写,或父写子读  管道中的数据 ,读走就没了  参数是一个整型数的数组,数组的大小是两个 ...

  4. linux进程间的通信实验,linux实验进程之间的通信.doc

    院 系: 计算机学院 实验课程:linux内核设计与实现 实验项目:进程之间的通信 指导老师:冯刚 开课时间: 2010 - 2011 年度第 2 学期 专 业:计算机科学与技术(师范) 班 级:2班 ...

  5. Linux下的有名管道---使用两个管道实现两个进程之间的通信(手机模式)

    环境:Vmware Workstation:CentOS-6.4-x86_64 说明: 对讲机模式:一个进程输入完成一句话,必须等待第二个进程输入完成一句话之后才能再次输入. 步骤: 1.创建两个管道 ...

  6. linux下的有名管道文件读写操作

    前言说明: 宿主主机系统:window 7 旗舰版 虚拟机:VMware 10.0.4 操作平台:Ubuntu 12.04 本文代码在个人电脑可以运行,不确保在其他平台可以正确运行 这两天在学进程通信 ...

  7. Linux下QProcess不产生finished信号、waitforfinished阻塞超时【defunct进程】

    文章目录 项目场景: 问题描述以及分析过程: defunct(僵尸进程): QProcess的实现: 理论原因: 尝试修改一: 第一次痛定思痛: 尝试修改二: 第二次修改能满足要求: 使用startd ...

  8. oracle EBS查进程,Linux下使用ps命令来查看Oracle DB以及EBS相关的进程

    Linux下可以使用ps命令来查看Oracle相关的进程 使用ps来查看Oracle数据库相关的服务 Oracle Listener 这个命令会列出Oracle Net Listener的进程 [or ...

  9. linux创建管道的函数,Linux下的有名管道(03)---使用函数创建和删除有名管道

    环境:Vmware Workstation:CentOS-6.4-x86_64 说明: 1.创建管道的时候,使用的函数:int mkfifo(const char *pathname, mode_t ...

最新文章

  1. 远程连接服务器的方法:
  2. mybatis02--增删改查
  3. USACO1.1.2|贪婪的送礼者
  4. oracle 数据库新建实例导入数据
  5. 345所开设人工智能本科专业高校名单大全
  6. linux查询用过的历史命令,在linux中,怎麼查看系统的版本,怎麼查看自己用过的历史命令...
  7. Intel Edison学习笔记(二)—— 入门环境配置
  8. C和指针---读书笔记16
  9. 优分享VR开源啦,优分享VR是基于Google VR开发的一款手机VR视频资源的聚合软件...
  10. PHP实现微信网页登陆授权开发
  11. JDBC个人学习总结
  12. 基于Python绘制一个摸鱼倒计时界面
  13. python股票技术指标计算,python股票量化交易(3)---趋势类指标MACD
  14. 天池大数据比赛-菜鸟仓库比赛-第二赛季记录
  15. 计算机电源选平衡,电脑里选择电源计划哪个好
  16. Python中的模块2
  17. 超过3万Mac已感染 “银麻雀”病毒 最新m1芯片也中招
  18. Scriptalert(“玄猫啊玄猫,玄猫要高考咯”)/script
  19. 艾艾贴关于Spring Cloud大型互联网分布式企业微服务云架构
  20. 【JavaWeb - 网页编程】一 HTML技术与CSS技术

热门文章

  1. linux复制分区表信息,parted分区
  2. AGX Xavier 35.1.0 enable pps 过程全记录
  3. java开发微信抢红包挂_Java 实现仿照微信抢红包算法,实测结果基本和微信吻合,附demo...
  4. HTML+CSS之找茬
  5. pythonsave函数_Python常用功能函数
  6. HAVING用法详解
  7. 解决孩子上课走神的好办法,99%的家长还不知道!
  8. 西子凌波回复集3(网友整理版)
  9. JS 将 string 转换成为 number
  10. 找对方法,一年顶十年