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创建子进程,之后,子进程会拷贝父进程的代码段/数据段及堆栈段,因此,创建的管道会被复制一份,子进程一份,父进程一份,为了使管道正常通讯,必须处理已有管道。

(0)

相关推荐

  • linux下进程间通信方式有哪些

    以linux操作系统为例(window也类似),linux下进程间通信方式如下: 操作方法 01 管道(Pipe)及有名管道(namedpipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了 ...

  • Linux下备份恢复技术的应用

    本文讲述Linux环境下,如何使用备份的脚本和命令以及商业化的软件来合理高效地保护磁盘数据安全。 备份与恢复系统承担着事前备份与事后恢复的职能。在当前高速发展的网络环境下,任何一个网络上的信息 系统 ...

  • Linux下重启apache的方法

    Linux系统为Ubuntu 一、Start Apache 2 Server /启动apache服务 # /etc/init.d/apache2 start or $ sudo /etc/init.d ...

  • linux下输入输出重定向

    inux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。 Linux默认输 ...

  • Linux下的多线程编程和fork()函数详解

     一.fork()函数 在操作系统的基本概念中进程是程序的一次执行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中 创建进程有两种方式:一是由操作 ...

  • Linux下ps命令的10个基本例子

    在Linux下ps命令是用于查看系统上运行的进程的最基本的命令之一。它提供了当前进程的同时,如用户ID,CPU使用率,内存使用率,命令名称等,它不显示实时数据,如top或htop命令的详细信息。但是, ...

  • linux下find查找命令用法

    Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  • Linux下安装Flash/Shockwave播放器

    现在,越来越多的FLASH作品被运用到网站设计中。但是,很多在Linux平台中使用的浏览器由于版本较旧或其他原因,导致没有Flash/Shockwave播放器插件而无法欣赏到精彩的FLASH作品,这已 ...

  • Linux下如何直接从硬盘启动Linux ISO镜像文件

    通常Linux启动Linux ISO镜像都要现将文件刻录到光盘或从USB驱动启动,下面小编就给大家介绍下Linux下如何直接从硬盘启动Linux ISO文件,一起来学习下吧。 我们在Ubuntu 14 ...