为什么我的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;
}
答案 0 :(得分:2)
Printf()是一个使用库缓冲区的库函数。默认情况下,库使用内联缓冲机制在终端上打印数据。要使printf()打印消息,请在传递给printf()的每个字符串中使用“\ n”。 当进程终止时,刷新缓冲区就是你打印的原因。
答案 1 :(得分:2)
你可以使用Monc建议的内容。即在你的陈述结尾添加'\ n'。或者,您可以使用btnGotoTop.setVisibility(View.GONE)
。它还清除了printf缓冲区并在stdout上打印。
答案 2 :(得分:1)
Monc和Devidas提供了可能解释的线索,但除非您使用古代系统编程,exit()
应该刷新stdout
和其他任何流中的待处理输出。
更可能的解释是,您在stdout
未绑定到终端或用于显示系统输出的任何环境中执行您的程序。一些基于Windows的IDE和一些在线系统的输出处理不足,难以调试这些问题。
有必要发布一个完整的程序,让读者调查问题是否源自程序中的其他地方。