我们平时写程序和用终端输入命令的时候,常常会用到管道,比如,在一段程序中,你可能会这样写 

      int fd[2]; pipe(fd)

      这时,我们就创建了一个管道,实现了进程之间的通信。

      再比如,我们用终端的时候,我们可能会这样输入命令: ls -la | grep test

      我们也是在两个命令之间创建了一个管道。

      这篇文章介绍一个函数,用来创建管道的函数:popen

      首先,我们先看看 man page 给的函数原型:

      #include <stdio.h>
       FILE *popen(const char *command, const char *type);

       int pclose(FILE *stream);

      下面看看一段测试程序:


/*
 * popen_main.c
 *
 *  Created on: 2013年11月28日
 *      Author: DLUTBruceZhang
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUF_LEN			4096

int main(int argc, char **argv, char **environ)
{
	char *buf = NULL;
	buf = (char*)malloc(sizeof(char) * MAX_BUF_LEN);
	FILE *file = popen("ls -la", "r");		/*子进程执行 ls -la ,并把输出写入管道中*/
	memset(buf, 0, sizeof(buf));
	while (!feof(file))
	{
		fgets(buf, MAX_BUF_LEN, file);		/*另一个进程读取管道中的内容*/
		printf("%s", buf);
	}
	pclose(file);
	free(buf);
	return 0;
}



     

首先,我用 popen 创建了一个管道,并执行了一个命令 “ls -la”, popen函数会调用 fork 和 pipe,所以,这个命令是一个子进程执行的,由于管道之间的共享可以发生在父子进程之间,所以,命令的输出可以由父进程读取,之后显示出来,下面的就是这段程序的输出:


总用量 32
drwxrwxr-x  3 administrator administrator  4096 2013-11-28 09:58 .
drwxrwxr-x 13 administrator administrator  4096 2013-11-28 09:58 ..
-rw-rw-r--  1 administrator administrator 10812 2013-11-28 09:58 .cproject
drwxrwxr-x  2 administrator administrator  4096 2013-11-28 10:05 Debug
-rw-rw-r--  1 administrator administrator   487 2013-11-28 10:05 popen_main.c
-rw-rw-r--  1 administrator administrator   762 2013-11-28 09:58 .project
-rw-rw-r--  1 administrator administrator   762 2013-11-28 09:58 .project