环境:Vmware Workstation;CentOS-6.4-x86_64

说明:

1、对于一个管道而言,在同一端要么只能读,要么只能写,不可能同时具有读写功能。

2、无名管道只能在相关的、有共同祖先的进程间使用(如父子进程,两个不相干的进程之间不能使用无名管道)。

3、读写管道与读写普通文件方式一样,调用write与read函数即可。

4、int pipe(int pipefd[2]); 函数的作用:创建一个无名管道。
函数的返回值:返回值为0代表创建管道成功;返回值为-1表示创建管道失败。
函数的参数:参数是一个数组,用来存储文件的描述符。数组中的第一个元素是用来读取数据,第二个参数使用用来写入数据。

5、int close(int fd); 函数返回值:返回0表示文件关闭成功,返回-1表示文件关闭失败。 函数的参数:参数是文件描述符。

程序:

使用无名管道实现,在子进程中写内容,在父进程中读取内容。

步骤:

1、创建并编辑makefile文件:

.SUFFIXES:.c .oCC=gccSRCS=main.c
OBJS=$(SRCS:.c=.o)
EXEC=mainstart: $(OBJS)$(CC) -o $(EXEC) $(OBJS)@echo "-----------------------------OK-----------------------".c.o:$(CC) -Wall -o $@ -c $<clean:rm -rf $(EXEC) $(OBJS)

2、创建并编写源文件main.c:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>int main(void)
{// 创建一个int类型的数组,存储的是文件描述符// 第一个元素是读取数据,第二个元素是写入数据int fd[2];// 打开无名管道,成功继续执行,不成功退出函数if (pipe(fd) == -1){printf("create nonamefifo failed : %s\n", strerror(errno));}// 创建字符数组,作为读写文件的缓冲区char buf[1024];// fork程序,并获取返回值pid_t pid = fork();if (pid == -1){printf("fork failed : %s\n", strerror(errno));}// 判断是子进程还是父进程if (pid > 0){// 清空缓冲区内存memset(buf, 0, sizeof(buf));// 通过文件描述符读取管道中的数据read(fd[0], buf, sizeof(buf));// 得到读取到的内容并输出printf("%s", buf);// 关闭读取数据端的管道close(fd[0]);}else{// 清空缓冲区内存memset(buf, 0, sizeof(buf));// 拷贝字符串到buf中strcpy(buf, "hello world\n");// 通过文件描述符把内容写入到管道中write(fd[1], buf, strlen(buf));// 关闭写数据端的管道close(fd[1]);}return 0;
}

3、编译并执行程序:

[negivup@negivup mycode]$ make
gcc -Wall -o main.o -c main.c
gcc -o main main.o
-----------------------------OK-----------------------
[negivup@negivup mycode]$ main
hello world

可以看出,通过无名管道,实现了两个进程之间的通信。

Linux下的无名管道相关推荐

  1. Linux学习笔记-无名管道,有名管道,消息队列

    Linux学习笔记-无名管道,命名管道,消息队列 无名管道 特点 创建无名管道的函数 demo 命名管道 特点 创建命名管道的函数 demo 消息队列 特点 创建消息队列涉及到的函数 demo 无名管 ...

  2. c语言系统编程六:Linux进程间通信之无名管道

    Linux进程间通信之无名管道 一 文件描述符复制 1.1 dup函数(复制文件描述符) 1.2 dup2函数(复制文件描述符) 二 无名管道的概述 三 无名管道的特点 四 无名管道的创建和使用 4. ...

  3. Linux内核中无名管道pipe和有名管道fifo的分析

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

  4. Linux系统编程- 无名管道(匿名管道)

    无名管道作为Linux进程间通讯,我们这里把理论和实际结合起来说明. 1.什么是管道 管道,英文位pipe,在学习linux系统编程一个重要概念.它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期 ...

  5. linux进程间通信:无名管道 pipe

    文章目录 内核层实现 结构 通信原理 特点 使用 函数声明 使用实例 单向通信 双向通信 编程注意事项 管道中无数据时读操作会阻塞 将管道的写端句柄关闭,不会影响读端数据读取 管道中没有数据,写操作关 ...

  6. linux系统调用创建无名管道,无名管道系统调用

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道 1.管道创建与关闭说明 管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd ...

  7. linux系统调用创建无名管道,linux 无名管道pipe和有名管道FIFO

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

  8. linux进程间通信(IPC) ---无名管道

    管道概述 管道(pipe)又称无名管道 无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符 任何一个进程在创建的时候,系统都会,给它分配4G的虚拟内存,分为3G的用户空间和1G的内核空间 ...

  9. linux进阶34——无名管道

    1. 管道通信 1.1 概念 一个进程在管道的尾部写入数据(管道的作用:数据的共享),另一个进程从管道的头部读出数据. 管道包括无名管道和有名管道.无名管道只能用于父进程和子进程间的通信,有名管道可用 ...

最新文章

  1. 解决异方差问题--加权最小二乘法
  2. 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.47. Gawk-4.1.1...
  3. DL:深度学习框架Pytorch、 Tensorflow各种角度对比
  4. step5 . day1 网络编程基础知识
  5. Taro+react开发(22)--模态框组件
  6. 如何查电脑ip地址_摄像机地址不对连不上网?教你快速更改IP地址
  7. SharePoint列表下拉框优化
  8. PHP open_basedir配置未包含upload_tmp_dir 导致服务器不能上传文件
  9. Microsoft DirectX组件v11.0完整版更新啦
  10. 嵌入式 C 语言(上)
  11. sim函数 matlab输出,关于MATLAB里sim函数?
  12. HTML讲解(HTML结构及标签)
  13. c语言中字符串的子式咋样输出,C语言常用代码
  14. java软件测试经典案例,java语言编程案例 - Mrsjjl的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  15. 馬斯洛:自我實現者,有16種共同特徵
  16. JAVA 华为云 流程控制基础题
  17. ruby-to_ary
  18. 用于针对DNN中后门攻击的蒸馏对策和中毒数据的去除
  19. 开放网络–服务提供商的未来
  20. 如何带领好新的员工?

热门文章

  1. 磁共振成像过程_磁共振成像人工智能提高性能
  2. 微信小程序图表插件 - wx-charts
  3. java计算机毕业设计网络教育学习平台源程序+mysql+系统+lw文档+远程调试
  4. 10 怎么写USB驱动,Cadence USB 2.0 Controller和PHY IP驱动移植
  5. windows下的makefile教程
  6. 大数据 Flink 教程之使用 Apache Flink 进行无服务器复杂事件处理
  7. java中用swing做一个windows计算器
  8. 中国天气——对流性天气过程复习笔记
  9. 【数学基础】L2范数之解救矩阵病态
  10. 金九银十,看看你在哪个阶段