【问题标题】:Using fgets() to read from different pipes, reading same message from both (should be different)使用 fgets() 从不同的管道读取,从两者读取相同的消息(应该不同)
【发布时间】:2014-10-03 00:15:06
【问题描述】:

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

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?

【问题讨论】:

  • 您将不得不发布一些代码来重现该问题。
  • 可能您对两条消息使用相同的缓冲区。
  • 无法调试我们看不到的代码。
  • 为什么reader() 不使用您的任何pipessizeof(getMessage) 显然是错误的。为什么要从名为 output 的文件指针中读取数据?

标签: c pipe fgets


【解决方案1】:

这里有问题:

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

由于getMessage 的类型为char *,那么sizeof(getMessage) 就是sizeof(char *),它很可能是48。您将“输出”中的那么多字节读入getMessage

相反,您需要指定要读取的字节数。即使您将sizeof(getMessage) 替换为您的缓冲区大小,这也意味着它将阻塞,直到读取完所有字节数或关闭输入。您的消息协议必须包含它期望读取的长度,或者您必须定义要读取的函数,直到输入关闭或出现特定分隔符。

那么你必须确保你读取的数据包含一个以空字符结尾的字符串,然后再尝试使用%s 或任何其他需要字符串的函数来打印它。

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

如果没有看到比这些 sn-ps 更多的完整程序,很难进一步调试

【讨论】:

  • 你在这里混淆了fgets()read() 吗?在没有空输入或错误的情况下,fgets() 将始终以 null 终止字符串,显然它将停止读取换行符,因此已经有一个分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2023-03-10
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
相关资源
最近更新 更多