linux中pipe和dup2详解

1、什么是管道

  管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

2、管道的创建

  int pipe(int fd[2])

  该函数创建的管道的两端处于一个中间进程,在实际应用中并没有太大意义,一般在pipe()创建管道后,再fork()一个子进程,然后通过管道实现父子进程之间的通信。

3、管道的读写规则

  管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。

4、pipe函数

  头文件:#include<unistd.h>

  函数原型: int pipe(int fd[2])

  函数参数:fd[2],管道的两个文件描述符,之后就是可以直接操作这两个文件描述符。其中fd[0]为读取端,fd[1]为写入端

  返回值:成功返回0,否则返回-1

  读fd[0]: close(fd[1]); read(fd[0], buf, BUF_SIZE);

  写fd[1]: close(fd[0]); read(fd[1], buf, strlen(buf));

5、例子

  

 1 #include <unistd.h>
 2 #include <stdio.h>
 3
 4 int main()
 5 {
 6     int fd[2];
 7     char buf[1024];
 8     pid_t pid;
 9
10     if(pipe(fd) != 0)
11     {
12         printf("pipe error\n");
13         return 0;
14     }
15
16     pid = fork();
17
18     if(pid == -1)
19     {
20         printf("fork error\n");
21         return 0;
22     }
23
24     else if(pid > 0)
25     {
26         printf("This is the father process, here write a string to the pipe\n");
27         char s[] = "Hello! write a string in the father process\n";
28         close(fd[0]);
29         write(fd[1], s, sizeof(s));              // 向管道中写入数据
30
31     }
32     else
33     {
34         printf("This is the child process, here read a string from the pipe\n");
35         close(fd[1]);
36         read(fd[0], buf, sizeof(buf));          //从管道中读取数据
37         printf("%s", buf);
38     }
39     waitpid(pid, NULL, 0);
40     return 0;
41 }

  输出结果为:

  This is the father process, here write a string to the pipe

  This is the child process, here read a string from the pipe

  Hello! write a string in the father process

  当管道中数据被读取后,管道为空。之后再read操作将默认的被阻塞,等待某些数据被写入。如需要设置为非阻塞,则可做如下设置:

  fcntl(filedes[0], F_SETFL, O_NONBLOCK);

  fcntl(filedes[1], F_SETFL, O_NONBLOCK);

6、dup2详解

  用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。

  其中头文件:#include <unistd.h>

  函数原型:int dup2(int oldhandle, int newhandle);

  例子还是使用上面那个例子,如下:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3
 4 int main()
 5 {
 6     int fd[2];
 7     char buf[1024];
 8     pid_t pid;
 9     int newfd;
10     if(pipe(fd) != 0)
11     {
12         printf("pipe error\n");
13         return 0;
14     }
15
16     pid = fork();
17
18     if(pid == -1)
19     {
20         printf("fork error\n");
21         return 0;
22     }
23
24     else if(pid > 0)
25     {
26         printf("This is the father process, here write a string to the pipe\n");
27         char s[] = "Hello! write a string in the father process\n";
28         close(fd[0]);
29         write(fd[1], s, sizeof(s));              // 向管道中写入数据
30
31     }
32     else
33     {
34         printf("This is the child process, here read a string from the pipe\n");
35         close(fd[1]);
36         dup2(fd[0], newfd);
37         read(newfd, buf, sizeof(buf));          //从管道中读取数据
38         printf("%s", buf);
39     }
40     waitpid(pid, NULL, 0);
41     return 0;
42 }

  运行的结果还是一样。只是在36行代码中调用了dup2,把fd[0]复制给newfd。


时间: 2024-10-12 20:26:18

linux中pipe和dup2详解的相关文章

(转)linux 中特殊符号用法详解

linux 中特殊符号用法详解 原文:https://www.cnblogs.com/lidabo/p/4323979.html # 井号 (comments)#管理员  $普通用户 脚本中 #!/bin/bash   #!/bin/sh井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行. # This line is comments.echo "a = $a" # a = 0由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就

linux中FTP服务搭建详解--1.匿名与权限

实验环境:在redhat6.5中安装配置FTP服务,并使用一台win7系统访问验证. 理论: FTP连接方式     支持两种连接模式:主动模式(Port)和被动模式(Pasv),这两种模式都是针对数据链路进行的,与控制链路无关. 主动模式工作过程: 1.客户端从自己的一个任意端口(N > 1024)和FTP服务器的21端口建立控制链路2.然后客户端发出Port指令告诉服务器连接自己的N+1端口来建立一条数据通道3.当FTP服务器接到这一指令时,会使用20端口连接用户在Port指令中指定的端口号

linux 中特殊符号用法详解

# 井号 (comments)#管理员  $普通用户 脚本中 #!/bin/bash   #!/bin/sh井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行. # This line is comments.echo "a = $a" # a = 0由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就行了.这常用在撰写过程中.#echo "a = $a" # a = 0如果被用在指令中,或者引号双引号括住的话

【转】linux 中dd命令使用详解

原文网址:http://xiaozhuang.blog.51cto.com/4396589/850657 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xiaozhuang.blog.51cto.com/4396589/850657 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 convert and copy a file 使用方式: dd [option] 如果你想要在线看 manual, 可以试试:

linux中rpm 、yum详解

一.程序包的组成: 1.底层内核:进程管理.内存管理.网络协议栈.驱动程序等 2.应用程序 :各种应用 使大家更好的通过它完成工作. 二.一个合格的程序包包含以下内容: 1.二进制程序,通常在linux /bin./sbin./usr/bin. /usr/sbin等目录下. 2.库文件.通常在linux /lib./lib64./usr/lib./usr/lib64等目录下. 3.配置文件.一般存放在linux /etc目录下. 4.说明和帮助文档,Linux man 和 info文件中. 三.

Linux中THIS_MODULE宏定义详解

一直都在耿耿于怀,这个THIS_MODULE到底是个什么玩意,linux内核中无处不在的东西.今天上网搜了一下,算是基本明白了.网上牛人写的已经比较详细,另外目前暂时没有时间往更深层次分析,所以直接贴过来得了... 转帖网址: http://blog.csdn.net/a954423389/archive/2010/12/27/6101369.aspx 源码位置: @ kernel/module.c @ include/linux/module.h 结构体struct module在内核中代表一

Linux中top命令参数详解

top命令用法top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况. top的使用方式 top [-d number] | top [-bnp] 参数解释: -d:number代表秒数,表示top命令显示的页面更新一次的间隔.默认是5秒. -b:以批次的方式执行top. -n:与-b配合使用,表示需要进行几次top命令的输出结果. -p:指定特定的pid进程号进行观察. 在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的

Linux中配置RAID及详解

博文大纲 什么是RAID Software,hardware RAID 软件磁盘阵列的设置 仿真RAID错误的救援模式 开机自动启动RAID并自动挂载 1.什么是RAID: 1.磁盘阵列全名是" Redundant Arrays of Inexpensive Disks, RAID ",英翻中的意思是:容错式廉价磁盘阵列. 2.RAID 可以通过一个技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘设备:而这个较大的磁盘功能可不止是储存而已,他还具有数据保护的功能呢. 3.整个

linux中的tr用法详解

tr命令可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字符成另一组字符,经常用来编写优美的单行命令,作用很强大. tr(选项)(参数) -c或--complerment:取代所有不属于第一字符集的字符:  -d或--delete:删除所有属于第一字符集的字符: -s或--squeeze-repeats:把连续重复的字符以单独一个字符表示: -t或--truncate-set1:先删除第一字符集较变第二字符集多出的字符. 将输入字符由大写转换为小写: echo "HELLO W[obj