我编写这个程序来测试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
答案 0 :(得分:1)
mkfifo()
的第二个参数应该是chmod
- 类型模式(例如0777
),而不是O_
个标记的组合。
您的流程正在创建一个没有足够权限的管道。
答案 1 :(得分:1)
你需要使用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)
答案 2 :(得分:0)
fifo
已创建但未稍后打开,请检查权限。您可以在创建fifo时指定permossion。