进程间通讯( IPC:Inter Processes Communication )
一. 管道(PIPE)
管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。 对于管道本身而言,不是普通的文件,不属于某个文件系统,其只存在于内存中;对于通讯而言,管道是半双工的通讯方式,数据在同一时刻只能在一个方向上流动;对于使用而言,管道没有名字,只能在具有公共祖先的进程之间使用。
1. 无名管道创建函数
#include <unistd.h>
//pipefd[0]为读;pipefd[1]为写
int pipe(int pipefd[2]);
2. 设置管道非阻塞
读端设置为非阻塞,写端没有关闭,没有数据时直接返回-1。
//获取原来的flags
int flags = fcntl(fd[0], F_GETFL);
// 设置新的flags
flags |= O_NONBLOCK;
// flags = flags | O_NONBLOCK;
fcntl(fd[0], F_SETFL, flags);
3. 管道缓冲区
管道在内存中对应一个缓冲区,不同的系统其大小不一定相同。 可以通过ulimit -a 命令来查看当前系统中创建文件所对应的内核缓冲区的大小,Ubuntu 14 下为4k。
通过函数查看:
#include <unistd.h>
long fpathconf(int fd, int name);
功能:该函数可以通过name参数查看不同的属性值
参数:
fd:文件描述符
name:
_PC_PIPE_BUF,查看管道缓冲区大小
_PC_NAME_MAX,文件名字字节数的上限
返回值:
成功:根据name返回的值的意义也不同。
失败: -1