linux 管道通信

来源:互联网 发布:网络相关的专业 编辑:程序博客网 时间:2024/06/05 22:51

无名管道:

  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) 返回值:  

若成功则返回0, 否则返回-1, 错误原因存于errno 中.
错误代码:
EACCESS 参数pathname 所指定的目录路径无可执行的权限
EEXIST 参数pathname 所指定的文件已存在.
ENAMETOOLONG 参数pathname 的路径名称太长.
ENOENT 参数pathname 包含的目录不存在
ENOSPC 文件系统的剩余空间不足
ENOTDIR 参数pathname 路径中的目录存在但却非真正的目录.
EROFS 参数pathname 指定的文件存在于只读文件系统内.


0 0
原创粉丝点击