管道的创建和判断是否存在
无名管道:int pipe( int fd[2] )
功能:创建无名管道 pipe
注意:pipe 拥有两个文件描述符,一个专用于读fd[0],一个专用于写fd[1]
创建出来的 pipe 的描述符,只能通过子进程继承的方式传递给别的进程,因此只能用于亲缘进程间的通信,其他非亲缘进程无法获取 pipe 的描述符。
不能有多个进程同时对 pipe 进行写操作,否则数据有可能被覆盖
总结: pipe 适用于一对一的、具有亲缘关系的进程间的通信。
int ret;
//定义数组存放无名管道产生的文件描述符,fd[0]为读端,fd[1]为写端
int fd[2];
//创建好一个无名管道
ret=pipe(fd);
if(ret==-1)
{
perror("创建无名管道失败!\n");
return -1;
}
有名管道 fifo :
特点:
1.任意多个进程之间都能通信(有无血缘关系都行)
2.有名管道不区分读写端,可以任意读写
3. 其他进程如果没有往有名管道中写入数据,那么read会阻塞当前进程(直到有进程往管道中写入数据,read才解除阻塞)
4.有名管道创建成功,会在你指定的路径下生成管道文件,无名管道没有管道文件(不能在共享文件夹中创建有名管道)
创建有名管道和判断是否存在操作:
int ret;
int fd;
//创建一个有名管道
ret=mkfifo("/home/ubuntu/myfifo",0777);
if(ret==-1)
{
//进一步分析错误的原因
if(errno!=EEXIST) //失败的原因是管道文件已经存在
{
perror("创建有名管道失败!\n");
return -1;
}
}
//打开有名管道
fd=open("/home/ubuntu/myfifo",O_RDWR);
法二:
if(access("/home/ubuntu/myfifo",F_OK))
{
MKFIFO("/home/ubuntu/myfifo",0644);
}