首先用man查看下popen的介紹:
popen(3) - Linux man page
Name
popen, pclose - pipe stream to or from a process
Synopsis
#include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream);
popen總是和pclose一起出現被使用的。popen() 創建一個管道,通過fork或者invoke一個子進程,然後執行command。返回值在標準IO流中,由於是在管道之中,因此數據流是單向的,command只能產生stdout或者讀取stdin,因此type只有兩個值:‘w’或‘r’。r表示command從管道中讀取數據流,而w表示command的stdout輸出到管道中。command無法同時讀取和輸出。popen返回該FIFO數據流的指針。
舉例用法(http://linux.chinaitlab.com/c/806015.html):
管道讀:先創建一個文件test,然後再test文件內寫入“Read pipe successfully !”
#include “stdio.h”
#include “stdlib.h”
int main()
{
FILE *fp;
char buf[200] = {0};
if((fp = popen(“cat test”, “r”)) == NULL) {
perror(“Fail to popen\n”);
exit(1);
}
while(fgets(buf, 200, fp) != NULL) {
printf(“%s”, buf);
}
pclose(fp);
return 0;
}
打印輸出: Read pipe successfully !
管道讀:
#include “stdio.h”
#include “stdlib.h”
int main()
{
FILE *fp;
char buf[200] = {0};
if((fp = popen(“cat > test1″, “w”)) == NULL) {
perror(“Fail to popen\n”);
exit(1);
}
fwrite(“Read pipe successfully !”, 1, sizeof(“Read pipe successfully !”), fp);
pclose(fp);
return 0;
}
執行完畢後,當前目錄下多了一個test1文件,打開,裏面內容爲Read pipe successfully !
---------------------------------------------------------------------------------------------
對於管道讀例子已經很清楚,而管道寫可能用的地方比較少。而對於寫可能更常用的是system函數:
system("cat "Read pipe successfully!" > test1")
可以看出,popen可以控制程序的輸入或者輸出,而system的功能明顯要弱一點,比如無法將ls的結果用到程序中。如果不需要使用到程序的I/O數據流,那麼system是最方便的。
而且system函數是C89和C99中標準定義的,可以跨平臺使用。而popen是Posix 標準函數,可能在某些平臺無法使用(windows應該是可以的吧,沒做過測試)。
如果上述兩個函數還無法滿足你的交互需求,那麼可以考慮exec函數組了。