FD_ZERO(2)

/* According to POSIX.1-2001 */
#include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

void FD_ZERO(fd_set *set);

fd_set은 여러개의 fd(file descriptor)를 select(2) 함수에서 읽기/쓰기/오류에 대한 event발생 여부 체크 모록을 관리하고 select(2) 실행후에 event가 발생한 fd인지 여부를 기록하는 구조체입니다.  FD_ZERO(2)는 fd_set에 설정된 모든 fd를 지우고 초기화합니다. 일반적으로 메모리를 초기화할 때에 memset(3)함수로 초기화하는 것처럼 FD_ZERO(2)는 fd_set을 초기화합니다.

 

 

파라미터

set
    - 초기화할 fd_set

 

RETURN

없음

 


활용 예제

 

#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>

int main(void)
{
    fd_set rfds;
    struct timeval tv;
    int retval;
    int sock, sock1, sock2;
    int max_fd = -1;
    char buffer[4096];
    int size;
    
    ......

    if((sock = socket(....)) == -1) {
        return 1;
    }

    if(bind(sock, ....) == -1) {
        return 1;
    }

    ......

    sock1 = accept(...);
    sock2 = accept(...);

    ......

    FD_ZERO(&rfds);
    FD_SET(sock1, &rfds);
    max_fd = sock1;

    FD_SET(sock2, &rfds);

    //가장 큰 fd값을 알아야 함.
    if(max_fd < sock2) { 
        max_fd = sock2;
    }

    /* timeout을 5초로 설정함 */
    memset(&tv, 0x00, sizeof(tv));

    tv.tv_sec = 5;
    retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);

    if (retval == -1) {
        fprintf(stderr, "select error: %s\n", strerror(errno));
    } else if (retval == 0) {
        fprintf(stderr, "timeout이 발생하였습니다.\n");
    } else {
        if(FD_ISSET(sock1, &rfds) == 0) {
            if((size = read(sock1, buffer, 4096)) > 0) {
                buffer[size] = 0x00;
                printf("SOCK1: %s\n", buffer);
            }
        }
        if(FD_ISSET(sock2, &rfds) == 0) {
            if((size = read(sock2, buffer, 4096)) > 0) {
                buffer[size] = 0x00;
                printf("SOCK2: %s\n", buffer);
            }
        }
    }

    return 0;
}

 


see also : Socket 통신과 Socket 응용

 

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요