在什么情况下fgets()卡住了?

时间:2012-10-24 03:02:40

标签: c linux fgets

printf("ok before fgets\n");
while ( (fgets(buff, sizeof(buff), fi)) != NULL)
{
    printf("ok after");
    if(write(connfd,buff,strlen(buff)) != strlen(buff))
    {
        printf("write() failed\n");
        close(connfd);
        exit(1);
    }
}

这是代码。代码打印“在fgets之前确定”,但它从不打印“ok after”。我想知道是什么问题。

如果信息不足,我正在编写网络通信程序。一旦客户端程序被杀死,这个程序就可以免于卡住并打印出几个“ok after”。它似乎与网络有关,但fgets()如何与网络相关的本地文件?我实际上是在尝试将此文件发送到远程客户端,但似乎在发送之前发生了错误。


在聊天讨论后,很明显问题根本不是fgets(),而是网络代码。循环中的诊断消息没有换行符,因此生成时诊断输出不会出现。


感谢Jonathan Leffler,问题解决了。 printf(“ok after”);信息没有出现,因为没有打印出换行符。所以通过添加换行符:printf(在\ n之后确定);我们可以看到打印出“ok after”。

2 个答案:

答案 0 :(得分:2)

有两种可能性:

  • fgets()中存在错误,并且永远不会输入while循环,因为它返回NULL。

  • fgets正在等待sizeof(buff)字符,新行或EOF:
  

fgets()函数应从流中读取字节到数组中   s指向,直到读取n-1个字节,或者< newline>阅读和   转移到s,或遇到文件结束条件。该   然后使用空字节终止字符串。

http://pubs.opengroup.org/onlinepubs/007904875/functions/fgets.html

因为你说它被卡住了,它表示第二个选项。

欢呼声

答案 1 :(得分:0)

fgets的手册页(Mac OS 10.5框中的那个):

  

fgets()和gets()函数不区分文件结尾和        错误;呼叫者必须使用feof(3)和ferror(3)来确定哪个        发生。

所以此时你没有给我们(或你自己)足够的数据来诊断问题。


请注意,(3)中只显示了您将参考的unix手册的哪一部分,并且与这些函数的参数无关。