2014-10-03 21 views
-1

使用fgets從已發送的2個不同管道中讀取2個不同的消息,因此應該返回2個不同的消息。我有兩個管道,並關閉不需要的孩子結束,我所有的fprintfs都被刷新,但他們都返回相同的消息,然後它只是掛起。我不知道爲什麼。調試沒有幫助我,雖然我可能錯過了一些東西。使用fgets()從不同的管道讀取,從兩個讀取相同的消息(應該是不同的)

int reader(FILE *output, int **pipes, char *getMessage) { 
if(output == NULL) { 
    fprintf(stderr, "Player quit\n"); 
} 
fgets(getMessage, sizeof(getMessage), output); 
printf("mes %s\n", getMessage); 
return 0; 

}

是我的讀者的方法(我用兩個相同的緩衝區,但我是用memset嘗試每次清除:

printf("test%c\n", roundDeck[deckPos]); 
      fprintf(input[pickturn], "yourturn %c\n", roundDeck[deckPos]); 
      fprintf(stdout, "yourturn %c\n", roundDeck[deckPos]); 
      fflush(input[pickturn]); 
      allHeldCards[pickturn][1] = roundDeck[deckPos]; 
      roundDeck[deckPos] = '-'; 
      //fclose(inPut); 
      deckPos++; 
      if(deckPos == 16) { 
       deckPos = 0; 
      } 
      printf("pt %d\n", pickturn); 
      reader(output[pickturn], pipes, getMessage); 
      if(msgProcess(pickturn, allIds, allFlags, allHeldCards, 
        getMessage, pipes, roundDeck, 
        deckPos, numPlayers, input) == 1) { 
       roundDeck[deckPos] = '-'; 
       deckPos++; 
       if(deckPos == 16) { 
       deckPos = 0; 
       } 
      } 
      memset(getMessage, 0, 50); 

的投入正在發生變化,其中他們需要在外面做,所以也許我使用memset不正確?

+3

你將不得不發佈一些代碼來重現問題看到了更多的完整方案。 – 2014-10-03 00:30:33

+1

可能您正在爲這兩個消息使用相同的緩衝區。 – 2014-10-03 00:31:39

+0

無法調試我們看不到的代碼。 – 2014-10-03 00:43:31

回答

0

這裏有一個問題:

fgets(getMessage, sizeof(getMessage), output); 

由於getMessage有類型char *,然後sizeof(getMessage)sizeof(char *)這很可能是48或。您從「輸出」中讀取了很多字節到getMessage

而是,您需要指定要讀取的字節數。即使用您的緩衝區大小替換sizeof(getMessage),這意味着它將阻塞,直到讀取了所有的字節數或輸入關閉。要麼你的消息協議必須包含它期望讀取的長度,要麼你必須定義你的函數來讀取,直到輸入被關閉或者發生某個分隔符爲止。

然後,您必須確保您讀取的數據包含空終止的字符串,然後再嘗試使用%s或任何其他需要字符串的函數進行打印。

不清楚爲什麼你的輸入被稱爲output而你的輸出也被稱爲input

很難進一步調試,而不不僅僅是這些片段

+0

您是否在'read()'中混淆了'fgets()',在這裏?在沒有空輸入或錯誤的情況下,'fgets()'將永遠終止字符串,顯然它將停止閱讀換行符,因此已經有一個分隔符。 – 2014-10-03 02:53:48

+0

@PaulGriffiths ty – 2014-10-03 03:14:45

相關問題