C的printf和fprintf(stdout)没有输出内容

22
这有点奇怪。我的代码没有输出我预期的内容。我在不同阶段添加了一些打印语句来查看哪里出错了。但仍然没有输出。 所以我在main函数开始处添加了一个printf语句,这让我感到非常困惑。 因此,我认为文件描述符可能出了问题。我把printf改成了fprintf。但仍然没有输出。使用fprintf打印到stderr确实可以工作!为什么会这样? 除了初始打印语句和返回语句之外,从main函数中删除所有内容会打印出结果。

代码

int main(void) {
    fprintf(stdout, "STARTED!");
    //Create an Internet domain socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    //If this fails exit and print the error
    if (sockfd == -1) {
        printf("Error %d, cannot create socket", errno);
        return 1;
    }
    printf("SOCKET CREATED!");

    //Creates a socket address
    struct sockaddr_in  addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    addr.sin_addr.s_addr = INADDR_ANY;

    //Attempts to bind to the socket address, again prints to error if this fails.
    if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
    {
        printf("Error %d, cannot bind", errno);
        return 1;
    }

    //Starts Listening for a client
    if (listen(sockfd, 1) == -1)
    {
        printf("Error %d, cannot listen", errno);
        return 1;
    }

    //If all is successful, server is operational
    while(1)
    {
        //Creates a file descripter for the connection
        int connfd;
        //And a socket address for the client
        struct sockaddr_in cliaddr;
        socklen_t cliaddrlen = sizeof(cliaddr);
        //If a connection attempt is made accepts it.
        connfd = accept(sockfd, (struct sockaddr *) &cliaddr, &cliaddrlen);
        if (connfd == -1) {
            //If the connection fails print an error
            printf("Error %d, cannot accept connection", errno);
            continue;
        }

        //Otherwise process the request
        else {
            printf("CONNECTED!");
            char end;
            end = 1;
            while (end)
            {
                process_request(connfd);
                end = 0;
            }
        }
        close(connfd);

    }
    close(sockfd);
    return 0;
}

哦,我相信代码本身可以改进,所以任何改进建议也将是很棒的! - Hector
如果您想要将标准输出(stdout)作为标准错误(stderr)来处理,那么命令 command 1>&2 将会有所帮助,以避免缓冲。 - Vincent Xue
1个回答

36

输出通常由系统缓冲。您可以调用fflush,但有时,取决于缓存的工作方式,仅以换行符结束输出就足够了。因此,请尝试更改

Output通常被系统缓冲。你可以调用fflush,但有时,根据缓存如何工作,仅仅在输出结尾加上一个换行符就足够了。因此,尝试做出以下更改:
fprintf(stdout, "STARTED!");

fprintf(stdout, "STARTED!\n");

如果那还不起作用,尝试

fprintf(stdout, "STARTED!\n");
fflush(stdout)

(而 stderr 通常不会被缓存,因为你希望立即看到错误。)

最后,在程序完成时(因为此时会刷新),您将看到输出,这可能解释了其余的行为。


2
天啊!我怎么会错过这么简单的东西!谢谢,我现在记得一年前我第一次使用C时也遇到了同样的问题。不过,我还是不明白为什么只有在主函数中加上打印语句就能运行,而其他代码放在那里就不行。 - Hector
2
有时候缓冲区也会自动刷新。除非您调用 fflush 或放置 \n,否则我不确定它有多可预测。 - Carl Norum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接