####################################################
管道(管道都是单向的半双工数据流)
管道分类:
1.无名管道:只能在具有共同祖先的进程间使用。
2.命令管道:可以在无论是否有亲缘关系的进程间使用,只能在同一主机上使用。
无名管道使用fcntl设置非阻塞模式,
有名管道可以使用open活fcntl设置非阻塞模式。
管道和fifo的限制:
OPEN_MAX :一个进程在任意时刻打开的最大描述符数;
PIPE_BUF :可原子的写往一个管道或fifo的最大数据量。
-----------------------------------------------------------
管道库函数:
#include <stdio.h>
FILE *popen(constchar *command, const char *type);
创建一个管道,返回一个描述符,并与一个进程建立连接。
type:
r:调用进程读进command的标准输出
w:调用进程写到command的标准输入
int pclose(FILE*stream);
关闭popen创建的io流。
使用popen的管道一般用库函数读写。
----------------
管道系统调用:
#include <unistd.h>
int pipe(intpipefd[2]);
pipefd[0]:read data from pipe to process
pipefd[1]:write data from process to pipe
use close() to close the pipefd.
#define _GNU_SOURCE
#include <fcntl.h>
#include <unistd.h>
int pipe2(int pipefd[2], int flags);
调用pipe创建并打开一个管道,返回两个描述符,一个读一个写,可以用close来关闭描述符。
使用pipe的管道一般用系统调用读写。
-----------------------------------------------------------
fifo库函数:
#include <sys/types.h>
#include <ssy/stat.h>
int mkfifo(constchar *pathname, mode_t mode);
pathname:管道的路径名
mode:(隐含flag=O_CREAT |O_EXCL)
S_IRUSR
S_IWUSR
S_IXUSR
S_IRGRP
S_IWGRP
S_IXGRP
S_IROTH
S_IWOTH
S_IXOTH
mkfifo函数创建一个FIFO,如果存在就返回EEXIST错误,然后用open函数打开FIFO返回描述符。调用unlink删除FIFO。
--------------------
fifo系统调用:
#include <unistd.h>
int unlink(const char *pathname);
用来删除mkfifo创建的管道
fifo一般用系统调用读写。
原文地址:http://blog.csdn.net/wowotouweizi/article/details/43988539