Linux下的无名管道pipe的设计

   1. 函数说明

  pipe(建立管道):

  1) 头文件 #include

  2) 定义函数: int pipe(int filedes[2]);

  3) 函数说明: pipe()会建立管道,并将文件描述词由参数filedes数组返回。

  filedes[0]为管道里的读取端

  filedes[1]则为管道的写入端。

  4) 返回值: 若成功则返回零,否则返回-1,错误原因存于errno中。

  错误代码:

  EMFILE 进程已用完文件描述词最大量

  ENFILE 系统已无文件描述词可用。

  EFAULT 参数 filedes 数组地址不合法。

  示例:

  root@wl-MS-7673:/home/wl/桌面/c++# cat -n pipe_test.cpp

  1

  2 #include

  3 #include

  4 #include

  5 #include

  6 #include

  7 #include

  8 #include

  9 /*

  10 * 程序入口

  11 * */

  12 int main()

  13 {

  14 int pipe_fd[2];

  15 pid_t pid;

  16 char buf_r[100];

  17 char* p_wbuf;

  18 int r_num;

  19

  20 memset(buf_r,0,sizeof(buf_r));

  21

  22 /*创建管道*/

  23 if(pipe(pipe_fd)<0)

  24 {

  25 printf("pipe create errorn");

  26 return -1;

  27 }

  28

  29 /*创建子进程*/

  30 if((pid=fork())==0) //子进程执行序列

  31 {

  32 printf("n");

  33 close(pipe_fd[1]);//子进程先关闭了管道的写端

  34 sleep(2); /*让父进程先运行,这样父进程先写子进程才有内容读*/

  35 if((r_num=read(pipe_fd[0],buf_r,100))>0)

  36 {

  37 printf("%d numbers read from the pipe is %sn",r_num,buf_r);

  38 }

  39 close(pipe_fd[0]);

  40 exit(0);

  41 }

  42 else if(pid>0) //父进程执行序列

  43 {

  44 close(pipe_fd[0]); //父进程先关闭了管道的读端

  45 if(write(pipe_fd[1],"Hello",5)!=-1)

  46 printf("parent write1 Hello!n");

  47 if(write(pipe_fd[1]," Pipe",5)!=-1)

  48 printf("parent write2 Pipe!n");

  49 close(pipe_fd[1]);

  50 wait(NULL); /*等待子进程结束*/

  51 exit(0);

  52 }

  53 return 0;

  54 }

  55

  56

  root@wl-MS-7673:/home/wl/桌面/c++# g++ pipe_test.cpp -o pipe_test

  root@wl-MS-7673:/home/wl/桌面/c++# ./pipe_test

  parent write1 Hello!

  parent write2 Pipe!

  10 numbers read from the pipe is Hello Pipe

  root@wl-MS-7673:/home/wl/桌面/c++#

  无名管道的创建是在fork创建前,通过pipe()创建管道,然后通过fork创建子进程,之后,子进程会拷贝父进程的代码段/数据段及堆栈段,因此,创建的管道会被复制一份,子进程一份,父进程一份,为了使管道正常通讯,必须处理已有管道。

时间: 2024-09-11 13:44:04

Linux下的无名管道pipe的设计的相关文章

练习--LINUX进程间通信之无名管道PIPE

IBM上放的这个系统不错,刚好可以系统回温一下LINUX的系统知识. http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 感觉年纪大了,前几年看的LINUX内核和系统的东东,忘了很多,要慢慢转化成永久记忆才可以. 今天,又拿起<LINUX内核设计与实现>,慢慢啃下去. ~~~~~~~~~~~~~~ 进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想

linux下使用命名管道实现多进程的日志记录功能

问题描述 linux下使用命名管道实现多进程的日志记录功能 请教如何 使用c语言实现呢 最近在学习linux环境编程遇到的问题 解决方案 运行程序的时候 yourprogroming 1 > you.log &2>1这样log 都到了you.log了 ,yourprogroming但需要标准输出.还可以在yourprogroming指定输出到某个文件之中

嵌入式Linux下高速USB主控制器的设计与实现

在嵌入式系统的发展历程中,Linux操作系统的源码公开,结构清晰,功能强大,可移植性强等特点使其在嵌入式领域应用越来越广泛.USB接口的热插拔,即插即用,数据传输可靠,扩展方便,成本低等优点使其逐渐成为嵌入式系统的必备接口之一.随着嵌入式系统应用领域的不断扩展,人们对其性能的要求不断提高,特别是USB设备的读写速度受到越来越多的关注.然而.目前多数嵌入式系统仅支持基础的USB低速或全速外设,不能满足人们对高速数据传输的要求.为此,基于AT91RM9200平台完成了高速USB的硬件设计和Linux

Linux下C编程,进程通信之无名管道通信

最近在看进程间的通信,下面说说管道通信之无名管道. 1.概述 管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性.如Linux命令,"ps -ef | grep root".如下图所示: 2.无名管道 2.1特点 (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间). (2)它是一个半双工的通信模式,具有固定的读端和写端. (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read.w

Linux进程间通信(二) 管道通信之无名管道及其基础实验

管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输 入(其实我更愿意将管道比喻为农村浇地的管子).Linux的管道主要包括两种:无名管道和有名管道.这一节 主要讲无名管道,首先介绍一下这两个管道.(特点很重要啊!) 1.无名管道 无名管道是 Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点: ①  它只能用于具有亲 缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间): ②  它是一个半双工的通信模 式,具有固定的读端和写端: ③

linux系统编程之管道(二) 管道读写规则和Pipe Capacity、PIPE_BUF

一.当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止. O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN. 示例程序如下: /************************************************************************* > File Name: process_.c > Author: Simba > Mail: dameng34@16

Linux下一个简单的日志系统的设计及其C代码实现

1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息,包括:变量名称及其值.消息结构定义.函数返回值及其执行情况.脚本执行及调用情况等.通过阅读日志文件,我们能够较快地跟踪程序流程,并发现程序问题.因此,熟练掌握日志系统的编写方法并快速地阅读日志文件,是对一个软件开发工程师的基本要求. 本文详细地介绍了Linux下一个简单的日志系统的设计方法,并给出了其C代码实现.本文为相关开发项目Linux下软

Linux下Fork与Exec使用

一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法.与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程. 多线程

Linux下多进程编程(C语言)

Linux下多进程编程(C语言) 一.    进程简介 1.进程是程序的执行.程序是静态的,进程是动态的. 2.进程在内存中有三部分组成:数据段.堆栈段和代码段.          代码段:就是存放程序代码的数据,如果有数个进程运行同一个一个程序,那么它们就可以使用同一个代码段(代码段是可以共享的):          堆栈段:存放的是子程序的返回地址.参数以及程序的局部变量,主要是保存进程的执行的环境,这里用到了栈先进后出的特性,可以看做具有记忆上一次执行的环境.          数据段:存