程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> popen函數

popen函數

編輯:關於C

我們平時寫程序和用終端輸入命令的時候,常常會用到管道,比如,在一段程序中,你可能會這樣寫

int fd[2]; pipe(fd)

這時,我們就創建了一個管道,實現了進程之間的通信。

再比如,我們用終端的時候,我們可能會這樣輸入命令: ls -la | grep test

我們也是在兩個命令之間創建了一個管道。

這篇文章介紹一個函數,用來創建管道的函數:popen

首先,我們先看看 man page 給的函數原型:

#include
FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

下面看看一段測試程序:

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


#include 
#include 
#include 

#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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved