2014-10-03 75 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

相关问题