FD_CLEAR(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_CLEAR(int fd, fd_set *set);

fd_set은 여러개의 fd(file descriptor)를 select(2) 함수에서 읽기/쓰기/오류에 대한 event발생 여부 체크 모록을 관리하고 select(2) 실행후에 event가 발생한 fd인지 여부를 기록하는 구조체입니다.

 

 set에 포함된 fd를 제거합니다. fd를 모니터링 대상에서 제외시킵니다.

 

 FD_CLEAR(2)는 거의 사용되지 않습니다. 이유는 select(2)함수를 실행할 때 마다 FD_ZERO(2), FD_SET(2)을 해야하므로 기존에 설정된 set을 재활용할 수 없기 때문입니다.

 

 

파라미터

fd
    - set에서 삭제할 file descriptor
set
    - fd를 제거할 fd_set
    - read용/write용/예외용에 대한 set이 있으며, 각각의 set에 fd를 제거할 수 있습니다.

 

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.

댓글을 달아 주세요