实验内容:

编写一程序,建立一个管道。同时,父进程生成子进程 p1,p2,这两个子进程分别向管道中写入各自的字符串,父进程读出它们。

实验相关的系统调用:

(1)pipe的创建

pipe(fd)<其中fd是文件对象数组指针>

fd[0]:pipe 的出口, 控制读操作

fd[1]:pipe 入口, 控制写操作

(2)pipe的读写

写操作:write(fd[1],buf,size)buf:存放消息的空间,size :要写入的字符长度

读操作:read(fd[0],buf,size)buf:存放消息的空间,size :要读出的字符长度

<important>:pipe读写存在互斥现象,读写不可同时进行,因此需要限制互斥操作

(3)int lockf(int files,int function,long size)

作用:LOCKF主要是给文件上锁。当p2进程想要访问文件是或者给文件上锁,那么就要等待p1释放锁,此时p2处于睡眠状态但当p1解开锁时,p2就可以向管道中写入数据。其目的在于控制p1、p2同时向管道中写入数据。

files是文件描述符;

function是锁定和 解锁;1 表示锁定,0 表示解锁;

size是锁定和解锁的字节数,若用 0,表示从文件的当前 位置到文件尾

实验环境:ubantu_vim

实验代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
int main(){int i,r;int p1;int p2;int p3;int fd[2];char buf[50];char s[50];pipe(fd);         //create a pipewhile((p1=fork())==-1); //create a child c1if(p1==0){//child1 processlockf(fd[1],1,0);      //ban others to writesprintf(buf,"messages from child process p1!\n");   //store char into bufprintf("child process p1!\n");write(fd[1],buf,50);   //write buf into pipesleep(5);              //let parent process read pipelockf(fd[1],0,0);      //realse writeexit(0);}else{//parent processwhile((p2=fork())==-1);//create a child cif(p2==0){//child2 processlockf(fd[1],1,0);sprintf(buf,"messages from child process p2!\n");printf("child process p2!\n");write(fd[1],buf,50);sleep(5);lockf(fd[1],0,0);exit(0);            //c2 exit}else{//parent processwhile((p3=fork())==-1);if(p3==0){//child processlockf(fd[1],1,0);sprintf(buf,"messages from child process p3!\n");printf("child process p3!\n");write(fd[1],buf,50);sleep(5);lockf(fd[1],0,0);exit(0);}wait(0);                //get the p1 exit messageif(r=read(fd[0],s,50)==-1)printf("can't read pipe\n");else printf("%s\n",s);wait(0);if(r=read(fd[0],s,50)==-1)printf("can't read pipe\n");else printf("%s\n",s);wait(0);if(r=read(fd[0],s,50)==-1)printf("can't read pipe\n");else printf("%s\n",s);exit(0);}}
}

实验结果: 

源文件文件名:mulpipe.c

可执行文件名:mulpipe

Linux管道通信【操作系统】利用pipe相关推荐

  1. linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...

    操作系统实训(Linux)--习题解答.例题解析.实验指导-王红-实验实验7软中断及管道通信课案.ppt 实验7 软中断及管道通信 一.实验目的(1)掌握linux系统软中断通信的实现方法.(2)掌握 ...

  2. linux管道通信 半双工通信

    本文转载自:http://blog.sina.com.cn/s/blog_5ed3e6210100d87d.html 在windows里进程间的通信主要用到是的消息,而在Linux里管道通信是一个不错 ...

  3. 实验9Linux共享内存通信,操作系统原理与Linux实践教程(卓越工程师培养计划系列教材)...

    导语 由申丰山和王黎明共同编著的<操作系统原理与Linux实践教程(卓越工程师培养计划系列教材)>一书理论与实践并重,全面.系统地阐述了操作系统的重要概念和原理,深入.细致地剖析了操作系统 ...

  4. 实验四:《操作系统》之管道通信

    Part4. 管道通信 往期回顾: Part0. 实验环境 Part1-1.熟悉UKylin环境 Part1-2.熟悉UKylin环境 Part2.进程控制 Part3.进程通信 一.实验目的 1.了 ...

  5. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

  6. Linux进程通信(一)——pipe管道

    本章内容 采用pipe管道如何进行进程之间的通信 pipe管道进程通信的规则和限制 Linux中pipe管道的实现机制和管理pipe管道的结构体 什么是进程通信 进程通信就是两个进程之间进行数据交换, ...

  7. 【操作系统实验】Linux进程通信—共享内存通信、管道通信

    Linux进程通信-共享内存通信.管道通信 一.实验目的: 二.实验题目: 1. 试设计程序利用共享内存完成如下进程通信 1.shmget函数 2.shmat函数 3.shmdt函数 4.shmctl ...

  8. Linux操作系统实验系列之实验四管道通信

    一.实验目的 1.了解什么是管道 2.熟悉UNIX/LINUX支持的管道通信方式 二.实验内容: 编写程序实现进程的管道通信.用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句 ...

  9. linux 进程和线程或线程和线程之间通过管道通信(pipe)

    linux 进程和线程或线程和线程之间通过管道通信(pipe) 转自:http://blog.csdn.net/robertkun/article/details/8095331 线程间通信: [cp ...

最新文章

  1. 每日起床前做这五个动作,可保障你终身不感冒——奥运福娃设计师韩美林老师亲测可用
  2. NEU 1040 Count
  3. iGrimace IG 各版本区别
  4. python 网络编程_Python网络编程(六)
  5. 20 个最常用的 Git 命令用法说明及示例
  6. DOM操作案例之--全选与反选
  7. db2 语句包括不必要的列表_DB2 SQL0956C 数据库堆中没有足够的处理空间可用来处理此语句...
  8. linux find 用法详解 + 实例
  9. 安卓移动应用开发实例_移动应用开发协会纳新 ||掌握信息,赢得未来
  10. P1117 [NOI2016]优秀的拆分
  11. oracle sql 正则表达式
  12. Loadrunner教程
  13. 微信、米聊等国内kik类手机通信录互动应用前景探讨
  14. 【python】python读取命令行选项参数
  15. 使用谷歌浏览器查看ws消息
  16. AI绘画网站最全收集!!
  17. 用while循环写四叶玫瑰数(自幂数)
  18. typescript中的类型type与接口interface
  19. 高三计算机教学计划,高三信息技术上册教学计划参考
  20. Python 安装pyqt—tools失败,记录

热门文章

  1. 如何装计算机网络驱动,如何安装驱动 电脑驱动的几种安装方法
  2. manjaro ssh免密登录
  3. 2、controller介绍
  4. CSharp 基本知识-数组
  5. 基于verilog的CRC校验(汇总)
  6. Kubernetes Scheduler源码分析--启动过程与多队列缓存(续)
  7. @Scheduled的使用
  8. 第二届“长安杯”电子数据竞赛试题wp
  9. QA实习第三周个人感受
  10. linux上如何搭建Java环境