2009年6月1日 星期一

popen

popen(建立管道I/O)

相關函數:pipe,mkfifo,pclose,fork,system,fopen

表頭文件:#include

定義函數:FILE * popen( const char * command,const char * type);

函數說明:
popen()會調用fork()產生子進程,然後從子進程中調用/bin/sh -c來執行參數command的指令。
參數type可使用“r”代表讀取,“w”代表寫入。只能單向,同一時間只能是r或w,不能同時rw。
依照此type值,popen()會建立管道連到子進程的標準輸出設備或標準輸入設備,然後返回一個文件指針。
隨後進程便可利用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標準輸入設備中。
此外,所有使用文件指針(FILE*)操作的函數也都可以使用,除了fclose()以外。
必須以pclose( )關閉。開啟的檔案指標能讓fgets( )、fgetss( )、fputs( )來使用。

返回值:
1.若成功則返迴文件指針,否則返回NULL,錯誤原因存於errno中。
2.如果調用fork()或pipe()失敗,或者不能分配內存將返回NULL,否則返回標准I/O。

錯誤代碼:EINVAL參數type不合法。

注意事項:
在編寫具SUID/SGID權限的程序時請儘量避免使用popen(),popen()會繼承環境變量,
通過環境變量可能會造成系統安全的問題。

範例

#include<stdio.h>
int main(void)
{
FILE *pp;
char buffer[80];
pp=popen("ls -l","r");
while(!feof(pp))
if(fgets(buffer,sizeof(buffer),pp)!=NULL)
printf("%s",buffer);
pclose(pp);
}


用 pipe 把一個 process 的輸出、輸入轉給任意的 process 所可能會發生的 問題就是 deadlock,譬如這兩個 processes 剛好同時都在等待「尚未產生」 的輸入時。唯一能避免 deadlock 的方法就是在 pipe 的兩端都要遵循嚴格的 deadlock-free 協定,但是需要這些 processes 之間的互相合作才能達成, 而對於像 popen() 這類的函數來說並不太適合。


ref:
1. Here (還有其它的可以參考參考)
2. Here
3. Here

沒有留言:

張貼留言