Linux管道pipe使用实例

转载 2012年03月23日 16:37:36

函数

#include <unistd.h>

int pipe(int filedes[2]);

描述

pipe()函数创建一个管道和指向该管道的一对文件描述符,并且将文件描述符存储到文件描述符数组filedes[]中。其中filedes[0]为读端,filedes[1]为写端。

 

返回值

0 – 管道创建成功;

-1 – 管道创建失败,同时errno置位;

错误指示

EFAULT – 无效的输入参数filedes;

EMFILE – 达到当前进程允许的文件描述符最大值;

ENFILE – 达到系统允许的打开文件的最大数;

实例

下边的例子首先创建一个管道,然后通过fork()创建当先进程的子进程。接着每个进程关闭读写管道不需要的文件描述符。子进程在当前路径下执行“ls –a”命令,通过将管道写描述符fd[1]复制成标准输出,将命令执行输出写到管道;父进程通过fd[0]读取管道数据并显示。


#include <sys/wait.h>#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>int main(int argc, char *argv[]){    int fd[2];

	pid_t pid;

	char read_buffer[500] = {0};

	int read_count = 0;

	int status = 0;

	//创建管道

	if (pipe(fd) < 0)

	{

		printf("Create pipe failed.");

		return -1;

	}

	//创建子进程

	if ((pid = fork()) < 0)

	{

		printf("Fork failed.");

		return -1;

	}

	//子进程操作

	if (pid == 0)

	{

		printf("[child]Close read endpoint...");

		close(fd[0]);   /* 关闭不使用的读 文件描述符 */

		//复制fd[1]到标准输出

		if (fd[1] != STDOUT_FILENO)

		{

			if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)

			{

				return -1;

			}

			//close fd[1],标准输出即为fd[1]

			close(fd[1]);

		}

		//执行命令

		status = system("ls –a");

		if (status == -1)

		{

			return -1;

		}

	}

	else

	{

		printf("[parent]Close write endpoint...");

		//父进程 读 操作

		close(fd[1]);   /* 关闭不使用的写 文件描述符 */

		//从管道读数据

		read_count = read(fd[0], read_buffer, 500);

		printf("Content under current directory: \n%s", read_buffer);

	}

}


linux管道pipe详解

管道 管道的概念: 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两...
  • oguro
  • oguro
  • 2016年12月23日 17:16
  • 19179

实例——Linux管道pipe的使用

实例——Linux管道pipe的使用Moakap总结函数#include int pipe(intfiledes[2]);描述       pipe()函数创建一个管道和指向该管道的一对文件描述符,并...
  • ljinddlj
  • ljinddlj
  • 2010年03月22日 21:05
  • 5771

linux进程间通信-----管道总结实例

linux进程间通信-----管道总结实例
  • Linux_ever
  • Linux_ever
  • 2015年12月20日 22:20
  • 1621

Linux进程间通信——命名管道应用实例

命名管道克服了管道没有名字的限制,同时除了具有管道的功能外(也是半双工),它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。...
  • li_wen01
  • li_wen01
  • 2017年01月11日 00:44
  • 355

有名管道读写实例

测试系统:RedHat Linux 9.0 源文件:/* * 管道通信:有名管道 * 无名管道只能用于具有亲缘关系的进程之间,而有名管道可以在互不相关的两个进程间 * 实现彼此通信。要注意,FIFO严...
  • ArduousBonze
  • ArduousBonze
  • 2008年07月06日 13:17
  • 4554

Linux操作系统中的管道(pipe)使用方法

前面在一段小程序中看到了mkfifo这样的一个函数,在baidu了一下之后对于进程间通信产生了一点兴趣,所以就小小的研究了一下。在一个多进程操作系统所提供的运行环境下,可以通过两种不同的途径或者说采用...
  • followingturing
  • followingturing
  • 2010年12月12日 21:43
  • 5339

进程通信的实例--管道(pipe)

4.7.5 进程通信的实例--管道(pipe) 1.管道pipe     进程通信的使用例子之一是UNIX系统的管道通信。UNIX系统从System V 开始,提供有名管道和无名管道两种通信方式...
  • thinkinwm
  • thinkinwm
  • 2013年03月23日 20:17
  • 6567

有名管道实例

代码来自:嵌入式linux应用开发标准教程 有名管道可以在两个没有亲缘关系的进程间通信,其实就是创建了个文件你写我读而已,加了先进先出机制 但是他是半双工的  一次只能进程A发进程B收      ...
  • liang890319
  • liang890319
  • 2012年12月11日 20:40
  • 2135

有名管道例子

有名管道 管道没有名字,它的通信只限定于亲缘关系间的通信,有名管道实现了无亲缘关系间的通信,原理是fifo提供了一个路径名与之关联,让fifo的文件存于系统中,只要知道该文件路径,就可以进行...
  • u012317017
  • u012317017
  • 2013年10月22日 11:35
  • 899

linux下使用管道pipe和select创建阻塞

linux下使用管道pipe和select创建阻塞的模型,大家参考一下 #include #include #include #include #include pthread_t tid...
  • tayinyinyueyue
  • tayinyinyueyue
  • 2017年01月20日 10:10
  • 1241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux管道pipe使用实例
举报原因:
原因补充:

(最多只允许输入30个字)