流管道
標(biāo)準(zhǔn)流管道
與linux中文件操作有文件流的標(biāo)準(zhǔn)I/O一樣,管道的操作也支持基于文件流的模式。接口函數(shù)如下:
庫函數(shù):popen();
原型:FILE *open (char *command,char *type);
返回值:如果成功,返回一個(gè)新的文件流。如果無法創(chuàng)建進(jìn)程或者管道,返回NULL。管道中數(shù)據(jù)流的方向是由第二個(gè)參數(shù)type控制的。此參數(shù)可以是r或者w,分別代表讀或?qū)?。但不能同時(shí)為讀和寫。在Linux 系統(tǒng)下,管道將會(huì)以參數(shù)type中第一個(gè)字符代表的方式打開。所以,如果你在參數(shù)type中寫入rw,管道將會(huì)以讀的方式打開。 使用popen()創(chuàng)建的管道必須使用pclose()關(guān)閉。其實(shí),popen/pclose和標(biāo)準(zhǔn)文件輸入/輸出流中的fopen()/fclose()十分相似。
庫函數(shù):pclose();
原型:int pclose(FILE *stream);
返回值:返回系統(tǒng)調(diào)用wait4()的狀態(tài)。
如果stream無效,或者系統(tǒng)調(diào)用wait4()失敗,則返回-1。注意此庫函數(shù)等待管道進(jìn)程運(yùn)行結(jié)束,然后關(guān)閉文件流。庫函數(shù)pclose()在使用popen()創(chuàng)建的進(jìn)程上執(zhí)行wait4()函數(shù),它將破壞管道和文件系統(tǒng)。
#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中文件操作有文件流的標(biāo)準(zhǔn)I/O一樣,管道的操作也支持基于文件流的模式。接口函數(shù)如下:
庫函數(shù):popen();
原型:FILE *open (char *command,char *type);
返回值:如果成功,返回一個(gè)新的文件流。如果無法創(chuàng)建進(jìn)程或者管道,返回NULL。管道中數(shù)據(jù)流的方向是由第二個(gè)參數(shù)type控制的。此參數(shù)可以是r或者w,分別代表讀或?qū)?。但不能同時(shí)為讀和寫。在Linux 系統(tǒng)下,管道將會(huì)以參數(shù)type中第一個(gè)字符代表的方式打開。所以,如果你在參數(shù)type中寫入rw,管道將會(huì)以讀的方式打開。 使用popen()創(chuàng)建的管道必須使用pclose()關(guān)閉。其實(shí),popen/pclose和標(biāo)準(zhǔn)文件輸入/輸出流中的fopen()/fclose()十分相似。
庫函數(shù):pclose();
原型:int pclose(FILE *stream);
返回值:返回系統(tǒng)調(diào)用wait4()的狀態(tài)。
如果stream無效,或者系統(tǒng)調(diào)用wait4()失敗,則返回-1。注意此庫函數(shù)等待管道進(jìn)程運(yùn)行結(jié)束,然后關(guān)閉文件流。庫函數(shù)pclose()在使用popen()創(chuàng)建的進(jìn)程上執(zhí)行wait4()函數(shù),它將破壞管道和文件系統(tǒng)。
#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;
}
總結(jié)