【问题标题】: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() 可以正常工作。为什么会这样?

【问题讨论】:

    标签: c asyncsocket


    【解决方案1】:

    stdio 被缓冲。您应该调用fflush(3)(或至少以\n 结束每个printf 格式字符串)。所以添加

     fflush(NULL);
    

    在您拨打select 之前。

    顺便说一句,最好使用poll(2) 然后select。阅读C10K problem

    并且您的代码应该测试系统调用失败,例如socketconnectselectpoll 等...使用perror

    此外,使用所有警告和调试信息 (gcc -Wall -g) 进行编译,并了解如何使用调试器 (gdb),以及strace(1)

    【讨论】:

      【解决方案2】:

      在字符串末尾添加换行符再试一次:

      int main(){
      printf("Main Start\n");
      connect_server();
      printf("Main End\n");
      }
      

      原因:stdout 是行缓冲的,你需要给它一个换行符来刷新输出。

      或通过fflush(stdout); 显式刷新它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        相关资源
        最近更新 更多