1. 管道 pipe
多用于父子进程间的通信。适用于普通文件的通信。如果需要传递他书文件,例如需要
由子进程向父进程传递特殊设备文件的描述符,则不适用。
接下来可以调用 fork()函数创建子进程。这之后,从两个进程中分别选一个描述符关闭,
使得两者之间留有一个读写通道(关闭进程的读描述符还是写描述符基于需要),之后便可
对描述符调用 read()/write()函数了。
popen()最后一个参数是标明返回文件的访问权限属性,“r”为读,“w”为写。
popen()类似于:先调用 pipe()建立一个管道,再通过 fork()创建子进程,然后调用 exec()
执行 cmdstring 系统调用。对于父进程,将管道的读端(fd[0])结合至标准的 I/O 流。
如果 type 是“w”,则文件指针连接到 cmdstring 的标准输出;如果 type 是“r”,文件指针
连接到 cmdstring 的标准输入。
2. 协同进程
当一过滤程序既产生某个程序的输出,又从该程序读取,便称为协同进程。进程创建两
个管道,一个是协同进程的标准输入,另一个是协同进程标准输出。
3. 命名管道 FIFO
FIFO 为命名管道,未命名管道只能在两个相关进程之间使用,而且这对进程还得具有共
同祖先。
mkfifoat:
1. path 是绝对路径时,fd 被忽略;
2. path 是相对路径,fd 参数是一打开的描述符;
3. path 是绝对路径,fd 有一个特殊值 AT_FDCWD,路径从当前目录开始。
创建好 FIFO 后,用 open 打开。FIFO 有以下用途:
1. shel 命令使用 FIFO 将数据从一管道传送到另一条时,无需创建中间临时文件;
2. 客户进程-服务器进程,FIFO 用作汇聚点,在客户进程和服务器进程二者之间传送
数据。
pipe 使用:
基于两个描述符(分别对应读与写)。
int pipe( fd[2] );
若调用成功,返回 0;否则,返回-1
popen() & pclose()
#include <stdio.h>
FILE* popen( const char* cmdstring , const char* type);
若成功,则返回文件指针,否则,返回 NULL
Int pclose( FILE * fp);
若成功,返回 cmding 终止状态,否则,返回-1
#include <sys/stat.h>
int mkfifo( const char* path, mode_t mode );
int mkfifoat( int fd, const char *path, mode_t mode);
两个函数返回值:若成功,则为 0,否则,返回-1;