2014-04-16 135 views
0

我写这个程序来测试FIFO中Ubuntu.The主程序创建子进程写的东西,然后父读取并打印无法打开FIFO

/* 
    communication with named pipe(or FIFO) 
    @author myqiqiang 
    @email [email protected] 
*/ 
#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); 
     } 
} 

但是,它显示了这个每我执行的时间,我相信前锋已经得到了证明。

[email protected]:~/code/ch03/experiment$ ./3 
create named pipe sucessfully 
read:cann't open the named pipe 
write:cann't open the named pipe 
+2

当'mkfifo'或'open'失败时使用'perror'。你想知道什么是'errno' –

回答

1

的第二个参数mkfifo()应该是一个chmod型模式(例如0777),而不是一个的O_标志组合。

您的进程正在创建一个没有足够权限的管道。

+0

谢谢你,我解决了你的指导问题。我知道mkfifo接受两个参数,那么它是如何工作的O_CREAT | O_EXCL和权限,是不是(O_CREAT | O_EXCL | 0777)?在我的书的指南中,我知道mkfifo接受两个参数,那么它是如何工作的O_CREAT | O_EXCL和权限? ,或者这意味着我的书是完全错误的? 请原谅我的英语。谢谢。 – Wythe

0

fifo已创建,但稍后未打开,因此请检查权限。您可以在创建fifo时指定Permossion。

+0

非常感谢,你是对的 – Wythe

1

当你mkfifo和运行作为普通用户(非根)权限是:

p -wx ------ 1个根根0 11月27日15:17 fifoserver

所以,你需要阅读权限,最简单的方法是将其添加到mkfifo标志:

如果(mkfifo(FIFO_SERVER,O_CREAT | O_EXCL | S_IRWXU)< 0)

它将创建的文件,你可以阅读:

prwx ------ 1个根根0 11月27日15:18 fifoserver