2015-12-24 72 views
1

我有這樣的C代碼:代碼命名管道輸送Ç問題

#define BUFSIZE 256 
    int main (int argc, char *argv[]) 
    { 
     int fdIn; 
     int fdOut; 


     if(argc != 3) 
     { 
      perror("Error argument"); 
      exit(1); 
     } 
     printf("Input Pipe\n"); 
     if((fdIn = open(argv[1], O_RDONLY))<0) 
     { 
      perror("Error opening input pipe"); 
      exit(1); 
     } 
     printf("Output Pipe\n"); 
     if((fdOut = open(argv[2], O_WRONLY))<0) 
     { 
      perror("Error opening output pipe"); 
      exit(1); 
     } 

     int c = 2; 
     printf("Start cicle\n"); 
     while(c--) 
     { 
      char var1[BUFSIZE]; 
      char var2[BUFSIZE]; 
      char string[100]; 

      memset(var1, 0, sizeof(var1)); 
      memset(var2, 0, sizeof(var2)); 
      memset(string, 0, sizeof(string)); 


      if(readLine(fdIn, var1, sizeof(var1)) == 0) 
      { 
       printf("exit \n"); 
       exit(0); 
      } 

      if(readLine(fdIn, var2, sizeof(var2)) == 0) 
      { 
       printf("exit \n"); 
       exit(0); 
      } 



      if(atoi(var2) != 0){ 
       if(atoi(var1) == 0 || (atoi(var1) % atoi(var2)) == 0) 
        sprintf(string,"ok\n"); 
       else 
        sprintf(string,"no\n"); 

      } 

      printf("%s", string); 
      writeLine(fdOut, string, strlen(string)); 
     } 
     close(fdOut); 
     close(fdIn); 
     exit(0); 
    } 

功能:

int readLine(int fd, char* str, int bufferSize) 
{ 
    return readToDel(fd, '\n', str, bufferSize); 
} 

int readToDel(int fd, char delimiter, char* str, int bufferSize) 
{ 
    int n; 
    int byteLetti =0; 
    int index=0; 


    do /* Read characters until NULL or end-of-input */ 
    { 

     if((n = read (fd, str+index, 1)) < 0) 
     { 
      perror("Error descriptor\n"); 
      exit(1); 
     } 
     byteLetti+=n; 


    } 
    while (n > 0 && *(str+index++) != delimiter && index < bufferSize); 


    return byteLetti; /* Return false if end-of-input */ 
} 
int writeLine(int fd, char* buffer, int bufferSize) 
{ 
    if(write (fd, buffer, bufferSize) < 0) 
    { 
     perror("Error"); 
     exit(1); 
    } 
} 

我的問題是如何使用這些管道,我將解釋:

我輸入有2個管道(輸入的程序是2個絕對管道的路徑),其中一個管道是輸入,另一個是輸出。 在輸入管道中有一些數據(特別是兩個數字),並且在闡述之後,我必須在輸出管道中寫入「ok」或「no」。 由於這個原因,通過終端,我做了echo "4\n2\n" > input,所以我在輸入的管道中寫入了兩個數字。 後來我以這種方式執行程序:

./program inputPipeAbsolutePath outputPipeAbsolutePath 

但程序上阻塞線printf("Output Pipe\n");之前第三,如果從開始聲明,我不知道爲什麼。 什麼問題?

我測試了它在Mac

UPDATE 沒有人能幫助我嗎?

+0

我想你混淆管道和流... – keshlam

+0

你能解釋我做什麼我錯了嗎?我是新管道 –

+1

使用perror參數可能會導致錯誤消息,如:「錯誤參數:成功」或「錯誤參數:不是打字機」。當你不關心errno的價值時,只需使用fprintf(或fputs)。 –

回答

0

關於輸出管道開啓的程序塊,我不知道 怎麼表現。

該程序的行爲與記錄;看到man fifo

 
     Normally, opening the FIFO blocks until the other end is opened also. 

所以,你一個選擇是啓動程序(。例如cat),從你輸出管道讀取;您的程序將繼續。
另一種選擇是使用O_RDWR而不是O_WRONLY:

 
     Under Linux, opening a FIFO for read and write will succeed both in 
     blocking and nonblocking mode. POSIX leaves this behavior undefined. 
     This can be used to open a FIFO for writing while there are no 
     readers available.