使用fgets()从不同的管道读取,从两者读取相同的消息(应该是不同的)

时间:2014-10-03 00:15:07

标签: c pipe fgets

我使用fgets从已发送2个不同消息的2个不同管道中读取,因此应该返回2个不同的消息。我每个都有2个管道并关闭了不需要的子端,我的所有fprintf都被刷新了但它们都返回相同的消息然后它就会挂起。我不知道为什么。调试没有帮助我,虽然我可能错过了一些东西。

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?

1 个答案:

答案 0 :(得分:0)

这里有一个问题:

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

由于getMessage的类型为char *,因此sizeof(getMessage)sizeof(char *),可能是48。您从“输出”中读取了许多字节到getMessage

相反,您需要指定要读取的字节数。即使用缓冲区大小替换sizeof(getMessage),也意味着它将被阻塞,直到读取了所有这些字节数,或者输入被关闭。您的消息协议必须包含它希望读取的长度,或者您必须定义要读取的函数,直到输入关闭或发生某个定界符。

然后,在尝试使用%s或任何其他需要字符串的函数打印之前,必须确保所读取的数据包含以空值终止的字符串。

不清楚为什么您的输入被称为output,而您的输出也被称为input

如果没有看到比这些片段更多的完整程序,那么很难进一步调试