范例 #include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
main()
{
char buffer[80];
int fd;
unlink(FIFO);
mkfifo(FIFO,0666);
if(fork()>0){
char s[ ] = “hello!\n”;
fd = open (FIFO,O_WRONLY);
write(fd,s,sizeof(s));
close(fd);
}
else{
fd= open(FIFO,O_RDONLY);
read(fd,buffer,80);
printf(“%s”,buffer);
close(fd);
}
}
執行 hello!
pclose(關閉管道I/O)
相關函數 popen
表頭文件 #include<stdio.h>
定義函數 int pclose(FILE * stream);
函數說明 pclose()用來關閉由popen所建立的管道及文件指針。參數stream為先前由popen()所返回的文件指針。
返回值 返回子進程的結束狀態。如果有錯誤則返回-1,錯誤原因存於errno中。
錯誤代碼 ECHILD pclose()無法取得子進程的結束狀態。
范例 參考popen()。
pipe(建立管道)
相關函數 mkfifo,popen,read,write,fork
表頭文件 #include<unistd.h>
定義函數 int pipe(int filedes[2]);
函數說明 pipe()會建立管道,並將文件描述詞由參數filedes數組返回。filedes[0]為管道裡的讀取端,filedes[1]則為管道的寫入端。
返回值 若成功則返回零,否則返回-1,錯誤原因存於errno中。
錯誤代碼 EMFILE 進程已用完文件描述詞最大量。
ENFILE 系統已無文件描述詞可用。
EFAULT 參數filedes數組地址不合法。
范例 /* 父進程借管道將字符串“hello!\n”傳給子進程並顯示*/
#include <unistd.h>
main()
{
int filedes[2];
char buffer[80];
pipe(filedes);
if(fork()>0){
/* 父進程*/
char s[ ] = “hello!\n”;
write(filedes[1],s,sizeof(s));
}
else{
/*子進程*/
read(filedes[0],buffer,80);
printf(“%s”,buffer);
}
}
執行 hello!
popen(建立管道I/O)
相關函數 pipe,mkfifo,pclose,fork,system,fopen
表頭文件 #include<stdio.h>
定義函數 FILE * popen( const char * command,const char * type);
函數說明 popen()會調用fork()產生子進程,然後從子進程中調用/bin/sh -c來執行參數command的指令。參數type可使用“r”代表讀取,“w”代表寫入。依照此type值,popen()會建立管道連到子進程的標准輸出設備或標准輸入設備,然後返回一個文件指針。隨後進程便可利用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標准輸入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使用,除了fclose()以外。
返回值 若成功則返回文件指針,否則返回NULL,錯誤原因存於errno中。
錯誤代碼 EINVAL參數type不合法。
注意事項 在編寫具SUID/SGID權限的程序時請盡量避免使用popen(),popen()會繼承環境變量,通過環境變量可能會造成系統安全的問題。
范例 #include<stdio.h>
main()
{
FILE * fp;
char buffer[80];
fp=popen(“cat /etc/passwd”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}
執行 root :x:0 0: root: /root: /bin/bash