我使用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?
答案 0 :(得分:0)
这里有一个问题:
fgets(getMessage, sizeof(getMessage), output);
由于getMessage
的类型为char *
,因此sizeof(getMessage)
为sizeof(char *)
,可能是4
或8
。您从“输出”中读取了许多字节到getMessage
。
相反,您需要指定要读取的字节数。即使用缓冲区大小替换sizeof(getMessage)
,也意味着它将被阻塞,直到读取了所有这些字节数,或者输入被关闭。您的消息协议必须包含它希望读取的长度,或者您必须定义要读取的函数,直到输入关闭或发生某个定界符。
然后,在尝试使用%s
或任何其他需要字符串的函数打印之前,必须确保所读取的数据包含以空值终止的字符串。
不清楚为什么您的输入被称为output
,而您的输出也被称为input
。
如果没有看到比这些片段更多的完整程序,那么很难进一步调试