程序终止而不打印

时间:2018-04-02 03:49:01

标签: c while-loop

为什么我的while循环在终止之前不打印我想要的打印语句?当我的程序退出时,我的打印语句都不会在终端中打印出来。我看不到循环可能退出的任何其他地方。

    while (1) {
        int num_read;
        // add the fd value into the fd_set value
        FD_SET(sock_fd, &read_fds);
        FD_SET(STDIN_FILENO, &read_fds);

        // choose which fds to watch
        select(sock_fd + 1, &read_fds, '\0', '\0', '\0');

        if (FD_ISSET(STDIN_FILENO, &read_fds)) { //check whether the fd value is in the fd_set

            num_read = read(STDIN_FILENO, buf, BUF_SIZE);
            if (num_read == 0) {
                printf("Print statement before terminating");
                break;
            }
            buf[num_read] = '\0';         // Just because I'm paranoid

            int num_written = write(sock_fd, buf, num_read);
            if (num_written != num_read) {
                perror("client: write");
                printf("Print statement before terminating");
                close(sock_fd);
                printf("Print statement before terminating");
                exit(1);
            }
        }

        if (FD_ISSET(sock_fd, &read_fds)) { //the socket with the server    
            num_read = read(sock_fd, buf, BUF_SIZE);
            buf[num_read] = '\0';
            printf("%s", buf); 
        }
    }
    printf("Print statement before terminating");
    close(sock_fd);
    printf("Print statement before terminating");
    return 0;
}

3 个答案:

答案 0 :(得分:2)

Printf()是一个使用库缓冲区的库函数。默认情况下,库使用内联缓冲机制在终端上打印数据。要使printf()打印消息,请在传递给printf()的每个字符串中使用“\ n”。 当进程终止时,刷新缓冲区就是你打印的原因。

请阅读此内容。 https://stackoverflow.com/a/36573578/5694959

答案 1 :(得分:2)

你可以使用Monc建议的内容。即在你的陈述结尾添加'\ n'。或者,您可以使用btnGotoTop.setVisibility(View.GONE)。它还清除了printf缓冲区并在stdout上打印。

答案 2 :(得分:1)

Monc和Devidas提供了可能解释的线索,但除非您使用古代系统编程,exit()应该刷新stdout和其他任何流中的待处理输出。

更可能的解释是,您在stdout未绑定到终端或用于显示系统输出的任何环境中执行您的程序。一些基于Windows的IDE和一些在线系统的输出处理不足,难以调试这些问题。

有必要发布一个完整的程序,让读者调查问题是否源自程序中的其他地方。