2014-04-16 242 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