流管道
標準流管道
與linux中文件操作有文件流的標準I/O一樣,管道的操作也支持基于文件流的模式。接口函數如下:
庫函數:popen();
原型:FILE *open (char *command,char *type);
返回值:如果成功,返回一個新的文件流。如果無法創建進程或者管道,返回NULL。管道中數據流的方向是由第二個參數type控制的。此參數可以是r或者w,分別代表讀或寫。但不能同時為讀和寫。在Linux 系統下,管道將會以參數type中第一個字符代表的方式打開。所以,如果你在參數type中寫入rw,管道將會以讀的方式打開。 使用popen()創建的管道必須使用pclose()關閉。其實,popen/pclose和標準文件輸入/輸出流中的fopen()/fclose()十分相似。
庫函數:pclose();
原型:int pclose(FILE *stream);
返回值:返回系統調用wait4()的狀態。
如果stream無效,或者系統調用wait4()失敗,則返回-1。注意此庫函數等待管道進程運行結束,然后關閉文件流。庫函數pclose()在使用popen()創建的進程上執行wait4()函數,它將破壞管道和文件系統。
#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 1024
int main()
{
? ? FILE *fp;
? ? char *cmd = "ps -ef";
? ? char buf[BUFSIZE];
? ? buf[BUFSIZE] ? ?= '\0';
? ? if ((fp=popen(cmd, "r"))==NULL)
? ? ? ? perror("popen");
? ? while((fgets(buf, BUFSIZE, fp)) != NULL)
? ? ? ? printf("%s", buf);
? ? pclose(fp);
? ? exit(0);
? ? return 0;
}
與linux中文件操作有文件流的標準I/O一樣,管道的操作也支持基于文件流的模式。接口函數如下:
庫函數:popen();
原型:FILE *open (char *command,char *type);
返回值:如果成功,返回一個新的文件流。如果無法創建進程或者管道,返回NULL。管道中數據流的方向是由第二個參數type控制的。此參數可以是r或者w,分別代表讀或寫。但不能同時為讀和寫。在Linux 系統下,管道將會以參數type中第一個字符代表的方式打開。所以,如果你在參數type中寫入rw,管道將會以讀的方式打開。 使用popen()創建的管道必須使用pclose()關閉。其實,popen/pclose和標準文件輸入/輸出流中的fopen()/fclose()十分相似。
庫函數:pclose();
原型:int pclose(FILE *stream);
返回值:返回系統調用wait4()的狀態。
如果stream無效,或者系統調用wait4()失敗,則返回-1。注意此庫函數等待管道進程運行結束,然后關閉文件流。庫函數pclose()在使用popen()創建的進程上執行wait4()函數,它將破壞管道和文件系統。
#include <stdio.h>
#include <unistd.h>#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 1024
int main()
{
? ? FILE *fp;
? ? char *cmd = "ps -ef";
? ? char buf[BUFSIZE];
? ? buf[BUFSIZE] ? ?= '\0';
? ? if ((fp=popen(cmd, "r"))==NULL)
? ? ? ? perror("popen");
? ? while((fgets(buf, BUFSIZE, fp)) != NULL)
? ? ? ? printf("%s", buf);
? ? pclose(fp);
? ? exit(0);
? ? return 0;
}
總結