📄 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 + -