?? 13.html
字號:
4 : Interrupted system call<br>
5 : Input/output error<br>
6 : Device not configured<br>
7 : Argument list too long<br>
8 : Exec format error<br>
9 : Bad file descriptor<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><br>
<font face='宋體' size='2'><a name=linuxc258></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋體' size='2'> <br>
mkfifo(建立具名管道) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 相關函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> pipe,popen,open,umask<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 表頭文件 </font> </div>
</td>
<td> <font face='宋體' size='2'> #include<sys/types.h><br>
#include<sys/stat.h><br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 定義函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> int mkfifo(const char * pathname,mode_t mode);<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 函數說明 </font> </div>
</td>
<td> <font face='宋體' size='2'> mkfifo()會依參數pathname建立特殊的FIFO文件,該文件必須不存在,而參數mode為該文件的權限(mode%~umask),因此umask值也會影響到FIFO文件的權限。Mkfifo()建立的FIFO文件其他進程都可以用讀寫一般文件的方式存取。當使用open()來打開FIFO文件時,O_NONBLOCK旗標會有影響<br>
1、當使用O_NONBLOCK 旗標時,打開FIFO 文件來讀取的操作會立刻返回,但是若還沒有其他進程打開FIFO 文件來讀取,則寫入的操作會返回ENXIO
錯誤代碼。<br>
2、沒有使用O_NONBLOCK 旗標時,打開FIFO 來讀取的操作會等到其他進程打開FIFO文件來寫入才正常返回。同樣地,打開FIFO文件來寫入的操作會等到其他進程打開FIFO
文件來讀取后才正常返回。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋體' size='2'> 若成功則返回0,否則返回-1,錯誤原因存于errno中。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 錯誤代碼 </font> </div>
</td>
<td> <font face='宋體' size='2'> EACCESS 參數pathname所指定的目錄路徑無可執行的權限<br>
EEXIST 參數pathname所指定的文件已存在。<br>
ENAMETOOLONG 參數pathname的路徑名稱太長。<br>
ENOENT 參數pathname包含的目錄不存在<br>
ENOSPC 文件系統的剩余空間不足<br>
ENOTDIR 參數pathname路徑中的目錄存在但卻非真正的目錄。<br>
EROFS 參數pathname指定的文件存在于只讀文件系統內。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 范例 </font> </div>
</td>
<td> <font face='宋體' size='2'> #include<sys/types.h><br>
#include<sys/stat.h><br>
#include<fcntl.h><br>
main()<br>
{<br>
char buffer[80];<br>
int fd;<br>
unlink(FIFO);<br>
mkfifo(FIFO,0666);<br>
if(fork()>0){<br>
char s[ ] = “hello!\n”;<br>
fd = open (FIFO,O_WRONLY);<br>
write(fd,s,sizeof(s));<br>
close(fd);<br>
}<br>
else{<br>
fd= open(FIFO,O_RDONLY);<br>
read(fd,buffer,80);<br>
printf(“%s”,buffer);<br>
close(fd);<br>
}<br>
}<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 執行 </font> </div>
</td>
<td> <font face='宋體' size='2'> hello!<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><br>
<font face='宋體' size='2'><a name=linuxc259></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋體' size='2'> <br>
pclose(關閉管道I/O) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 相關函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> popen<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 表頭文件 </font> </div>
</td>
<td> <font face='宋體' size='2'> #include<stdio.h><br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 定義函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> int pclose(FILE * stream);<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 函數說明 </font> </div>
</td>
<td> <font face='宋體' size='2'> pclose()用來關閉由popen所建立的管道及文件指針。參數stream為先前由popen()所返回的文件指針。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋體' size='2'> 返回子進程的結束狀態。如果有錯誤則返回-1,錯誤原因存于errno中。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 錯誤代碼 </font> </div>
</td>
<td> <font face='宋體' size='2'> ECHILD pclose()無法取得子進程的結束狀態。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 范例 </font> </div>
</td>
<td> <font face='宋體' size='2'> 參考popen()。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><br>
<font face='宋體' size='2'><a name=linuxc260></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋體' size='2'> <br>
pipe(建立管道) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 相關函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> mkfifo,popen,read,write,fork<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 表頭文件 </font> </div>
</td>
<td> <font face='宋體' size='2'> #include<unistd.h><br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 定義函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> int pipe(int filedes[2]);<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 函數說明 </font> </div>
</td>
<td> <font face='宋體' size='2'> pipe()會建立管道,并將文件描述詞由參數filedes數組返回。filedes[0]為管道里的讀取端,filedes[1]則為管道的寫入端。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋體' size='2'> 若成功則返回零,否則返回-1,錯誤原因存于errno中。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 錯誤代碼 </font> </div>
</td>
<td> <font face='宋體' size='2'> EMFILE 進程已用完文件描述詞最大量。<br>
ENFILE 系統已無文件描述詞可用。<br>
EFAULT 參數filedes數組地址不合法。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 范例 </font> </div>
</td>
<td> <font face='宋體' size='2'> /* 父進程借管道將字符串“hello!\n”傳給子進程并顯示*/<br>
#include <unistd.h><br>
main()<br>
{<br>
int filedes[2];<br>
char buffer[80];<br>
pipe(filedes);<br>
if(fork()>0){<br>
/* 父進程*/<br>
char s[ ] = “hello!\n”;<br>
write(filedes[1],s,sizeof(s));<br>
}<br>
else{<br>
/*子進程*/<br>
read(filedes[0],buffer,80);<br>
printf(“%s”,buffer);<br>
}<br>
}<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 執行 </font> </div>
</td>
<td> <font face='宋體' size='2'> hello!<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><br>
<font face='宋體' size='2'><a name=linuxc261></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋體' size='2'> <br>
popen(建立管道I/O) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 相關函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> pipe,mkfifo,pclose,fork,system,fopen<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 表頭文件 </font> </div>
</td>
<td> <font face='宋體' size='2'> #include<stdio.h><br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 定義函數 </font> </div>
</td>
<td> <font face='宋體' size='2'> FILE * popen( const char * command,const char
* type);<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 函數說明 </font> </div>
</td>
<td> <font face='宋體' size='2'> popen()會調用fork()產生子進程,然后從子進程中調用/bin/sh -c來執行參數command的指令。參數type可使用“r”代表讀取,“w”代表寫入。依照此type值,popen()會建立管道連到子進程的標準輸出設備或標準輸入設備,然后返回一個文件指針。隨后進程便可利用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標準輸入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使用,除了fclose()以外。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋體' size='2'> 若成功則返回文件指針,否則返回NULL,錯誤原因存于errno中。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 錯誤代碼 </font> </div>
</td>
<td> <font face='宋體' size='2'> EINVAL參數type不合法。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 注意事項 </font> </div>
</td>
<td> <font face='宋體' size='2'> 在編寫具SUID/SGID權限的程序時請盡量避免使用popen(),popen()會繼承環境變量,通過環境變量可能會造成系統安全的問題。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 范例 </font> </div>
</td>
<td> <font face='宋體' size='2'> #include<stdio.h><br>
main()<br>
{<br>
FILE * fp;<br>
char buffer[80];<br>
fp=popen(“cat /etc/passwd”,”r”);<br>
fgets(buffer,sizeof(buffer),fp);<br>
printf(“%s”,buffer);<br>
pclose(fp);<br>
}<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋體' size='2'> 執行 </font> </div>
</td>
<td> <font face='宋體' size='2'> root :x:0 0: root: /root: /bin/bash<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><br>
</div>
</td>
</tr>
</table>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -