无法打开FIFO
Posted
技术标签:
【中文标题】无法打开FIFO【英文标题】:can not open FIFO 【发布时间】:2014-04-16 05:32:59 【问题描述】:我写这个程序是为了在Ubuntu中测试FIFO。主程序创建一个子进程来写东西,然后父进程读取并打印它
/*
communication with named pipe(or FIFO)
@author myqiqiang
@email myqiqiang@gmail.com
*/
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>
#define FIFO_SERVER "/home/myqiqiang/fifoserver" //fifo directioy
#define BUFFERSIZE 80
void main()
pid_t pc;
int flag,fd;
char data[BUFFERSIZE+1];
char* test="a test string";
if(mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)<0) //create fifo
printf("create named pipe failed\n");
exit(1);
printf("create named pipe sucessfully\n");
pc=fork(); //create process
if(pc==0)
memset(data,0,strlen(test));
fd=open(FIFO_SERVER,O_WRONLY,0); //open the fifo
if(fd==-1) //if open failed
printf("write:cann't open the named pipe\n");
unlink(FIFO_SERVER);
exit(1);
flag=write(fd,test,13); //write data
if(flag==-1) //write failed
printf("write data error\n");
unlink(FIFO_SERVER);
exit(1);
printf("write data successfully\n");
close(fd); //clsoe fifo
unlink(FIFO_SERVER); //delete fifo
else
if(pc>0)
memset(data,0,strlen(test));
fd=open(FIFO_SERVER,O_RDONLY,0);
if(fd==-1)
printf("read:cann't open the named pipe\n");
unlink(FIFO_SERVER);
exit(1);
flag=read(fd,data,13);
if(flag==-1)
printf("read data error\n");
unlink(FIFO_SERVER);
exit(1);
printf("the data is%s\n",data);
close(fd);
unlink(FIFO_SERVER);
else
printf("create process error!\n");
unlink(FIFO_SERVER);
exit(1);
但是,每次我执行它都会显示这个,我确信fifo已经被装箱了。
myqiqiang@ubuntu:~/code/ch03/experiment$ ./3
create named pipe sucessfully
read:cann't open the named pipe
write:cann't open the named pipe
【问题讨论】:
当mkfifo
或open
失败时使用perror
。你想知道errno
是什么
【参考方案1】:
mkfifo()
的第二个参数应该是chmod
类型的模式(例如0777
),而不是O_
标志的组合。
您的进程正在创建一个没有足够权限的管道。
【讨论】:
谢谢你,我用你的指南解决了这个问题。顺便说一句,我在我的书的指南中写了 mkfifo(FIFO_SERVER,O_CREAT|O_EXCL),我知道 mkfifo 接受两个参数,那么它是如何工作的 O_CREAT|O_EXCL 和权限,是 (O_CREAT|O_EXCL|0777)?,或者它意味着我的书完全错了吗?请原谅我的英语。谢谢。【参考方案2】:您需要将 mkfifo 与 S_IWUSR、S_IRUSR、S_IRGRP 、S_IROTH 模式一起使用,请参阅 http://pubs.opengroup.org/onlinepubs/009604599/functions/mkfifo.html
if(mkfifo(FIFO_SERVER, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH)<0)
【讨论】:
【参考方案3】:当您执行 mkfifo 并以普通用户(非 root)身份运行时,您的权限是:
p-wx----- 1 root root 0 Nov 27 15:17 fifoserver
所以你需要读取权限,最简单的方法是添加到mkfifo FLAGS:
if(mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|S_IRWXU)
它将创建您可以读取的文件:
prwx------ 1 root root 0 Nov 27 15:18 fifoserver
【讨论】:
【参考方案4】:fifo
已创建,但稍后未打开,因此请检查权限。您可以在创建 fifo 时指定 permossion。
【讨论】:
以上是关于无法打开FIFO的主要内容,如果未能解决你的问题,请参考以下文章
是否应该在刚刚从该 FIFO 读取所有数据之后从 FIFO 块中读取?