无名管道:
1)管道是半双工的,只能支持数据的单向流动;两进程间需要通信时需要建立起两个管道;
2)使用无名管道通讯的进程必须拥有公共祖先进程
pipe:
1) 头文件 :
<span style="white-space:pre"> </span>#include<unistd.h>
2) 定义函数:
<span style="white-space:pre"> </span>int pipe(int filedes[2]);
3) 函数说明:
pipe()会建立管道,并将文件描述词由参数filedes数组返回。
filedes[0]为管道里的读取端。filedes[1]则为管道的写入端。
4) 返回值:
若成功则返回零,否则返回-1,错误原因存于errno中。
错误代码:EMFILE 进程已用完文件描述词最大量
ENFILE 系统已无文件描述词可用。
EFAULT 参数 filedes 数组地址不合法。
pipen:
1) 头文件 :
<span style="white-space:pre"> </span>#include <stdio.h>
2) 定义函数:
<span style="white-space:pre"> </span>FILE *popen(const char *command, const char *type);
<span style="white-space:pre"> </span>int pclose(FILE *stream);
3) 函数说明:
command 参数是一个字符串指针
指向的是一个以 null 结束符结尾的字符串, 这个字符串包含一个 shell 命令. 这个命令被送到 /bin/sh 以 -c 参数执行, 即由 shell 来执行.
type 参数也是一个指向以 null 结束符结尾的字符串的指针
这个字符串必须是 'r' 或者 'w’ 来指明是读还是写。
stream 参数是一个普通的 标准I/O流, stream 只能用 pclose() 函数来关闭, 而不是 fclose() 函数.
4) 相关说明:
向这个流的写入被转化为对 command 命令的标准输入; 而 command 命令的标准输出则是和调用 popen(), 函数的进程相同,除非这个被command命自己改变. 相反的, 读取一个 “被popen了的” 流, 就相当于读取 command 命令的标准输出, 而 command 的标准输入则是和调用 popen, 函数的进程相同.注意, popen 函数的输出流默认是被全缓冲的.
pclose() 函数等待相关的进程结束并返回 一个 command 命令的 退出状态, 就像 wait4 函数 一样
有名管道:
(1)半双工
(2)使用有名管道通讯的进程不需要有公共祖先进程
mkfifo:
1) 头文件 :
<span style="white-space:pre"> </span>#include<sys/stat.h>
2) 定义函数:
<span style="white-space:pre"> </span>int mkfifo(const char* pathname, mode_t mode);
3) 函数说明:
pathname 参数创建的FIFO路径
mode参数指定创建的FIFO访问模式。这个访问会与当前进程的umask进程运算,以产生实际应用的权限模式。
4) 返回值:
错误代码:
EACCESS 参数pathname 所指定的目录路径无可执行的权限
EEXIST 参数pathname 所指定的文件已存在.
ENAMETOOLONG 参数pathname 的路径名称太长.
ENOENT 参数pathname 包含的目录不存在
ENOSPC 文件系统的剩余空间不足
ENOTDIR 参数pathname 路径中的目录存在但却非真正的目录.
EROFS 参数pathname 指定的文件存在于只读文件系统内.