为啥程序不在main中执行打印语句?
Posted
技术标签:
【中文标题】为啥程序不在main中执行打印语句?【英文标题】:Why does the program not execute print statements in main?为什么程序不在main中执行打印语句? 【发布时间】:2014-09-24 12:20:54 【问题描述】:#include <sys/socket.h>
#include<stdio.h>
#include <netinet/in.h>
#include<string.h>
int init_socket(int *fd, int port)
struct sockaddr_in serv_addr, cli_addr;
*fd = socket(AF_INET, SOCK_STREAM, 0);
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
bind(*fd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr))
listen(*fd,1); //Change as per requirement
int connect_server()
int fd, j, result;
fd_set readset;
init_socket(&fd,6001);
while(1)
FD_ZERO(&readset);
FD_SET(fd, &readset);
select(3, &readset, NULL, NULL, NULL);
int main()
printf("Main Start");
connect_server();
printf("Main End");
我正在尝试执行此代码,但没有显示任何 printf()。当 select() 从代码中删除时, printf() 可以正常工作。为什么会这样?
【问题讨论】:
【参考方案1】:stdio 被缓冲。您应该调用fflush(3)(或至少以\n
结束每个printf
格式字符串)。所以添加
fflush(NULL);
在您拨打select
之前。
顺便说一句,最好使用poll(2) 然后select
。阅读C10K problem
并且您的代码应该测试系统调用失败,例如socket
、connect
、select
或poll
等...使用perror
此外,使用所有警告和调试信息 (gcc -Wall -g
) 进行编译,并了解如何使用调试器 (gdb
),以及strace(1)。
【讨论】:
【参考方案2】:在字符串末尾添加换行符再试一次:
int main()
printf("Main Start\n");
connect_server();
printf("Main End\n");
原因:stdout
是行缓冲的,你需要给它一个换行符来刷新输出。
或通过fflush(stdout);
显式刷新它。
【讨论】:
以上是关于为啥程序不在main中执行打印语句?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 PowerShell(使用 Perl)在简单的打印语句中删除双引号?
C语言中怎样if语句的单分支选择结构比较三个数的大小并打印出最大数和最小数