이 프로그램이 non-blocking으로 작동이 되는지 궁금합니다.

faraplay의 이미지

제가 알기로 non-blcoking 를 하는 방법은

int oldopts;
oldopts = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, oldopts | O_NONBLOCK);

이렇게 하는 것으로 알고 있습니다. 그런데 어떤 소스를 보는데

 
 int     i;
    int     opt = 1;
    long    sockArgs;
    int     sock;
    struct sockaddr_in serv_addr;
    struct epoll_event  ev;
 
    memset ((char *) &serv_addr, 0x00, sizeof(serv_addr));
    serv_addr.sin_family        = AF_INET;
    serv_addr.sin_addr.s_addr   = htonl(INADDR_ANY);
    serv_addr.sin_port          = (unsigned short)htons (port);
    /* open tcp socket */
    if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
         return -1;
 
    setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
 
    if (bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
          return -1;
 
    if (listen(sock, 1) < 0)
        return -1;
    sockArgs = fcntl(sock, F_GETFL);
    fcntl(sock, F_SETFL, sockArgs | FNDELAY);
 
    ev.events = EPOLLIN;
    ev.data.fd = sock;
    epoll_ctl(epollFd, EPOLL_CTL_ADD, sock, &ev);

이런 식으로 작성된 소스가 있더라고요

 sockArgs = fcntl(sock, F_GETFL);
 fcntl(sock, F_SETFL, sockArgs | FNDELAY);

이런 방법으로도 non-blocking으로 작동이 되는건지 궁금합니다.

yhsuk의 이미지

block모드로 동작합니다.
block모드로 동작하더라도 epoll_wait를 사용한 멀티플렉싱으로 동작하기 때문에,
쓰레드 없이도 잘 동작할 수 있습니다.

epoll_wait나 select같은 함수 통과후에 recv를 할 때도 블럭되는 경우가 있다는 쓰레드를 kldp에서 본적이 있습니다.
만약 그런 경우가 생긴다면 recv timeout을 주어서 빠져나오도록 하면 되겠습니다.

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"