c - fgets() 在什么情况下会卡住?

标签 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”,但从不打印“ok after”。我想知道是什么问题。

以防资料不够,我正在写一个网络通讯程序。一旦客户端程序被杀死,这个程序就不会卡住,并打印出几个“ok after”。好像跟网络有关,但是fgets()怎么会是本地文件跟网络有关呢?我实际上是在尝试将此文件发送到远程客户端,但似乎错误发生在发送之前。


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


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

最佳答案

有两种可能性:

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

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

The fgets() function shall read bytes from stream into the array pointed to by s, until n-1 bytes are read, or a <newline> is read and transferred to s, or an end-of-file condition is encountered. The string is then terminated with a null byte.

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

既然你说卡住了,那说明是第二个选项。

干杯

关于c - fgets() 在什么情况下会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13042405/

相关文章:

c - 以有序的方式在链表中间插入一个元素?

python - 使用python将波斯字符串保存到mysql数据库中

c - 编译 C(非 C++)OpenCV 代码时出现问题

c - 生成的 shell 在缓冲区溢出后迅速终止

c - 使用 C 中的 fgets 和 strtok 读取文件并将信息保存在喜欢的列表中

c - 警告初始化从指针生成整数,无需使用 fgets 进行强制转换

c - 在c中评估Linux文件复制命令

c - 侵入式链表的指针算法

c - 老版本的C语法差异?

c - C程序中的fgets突然退出