CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): hikim (김호일)
날 짜 (Date): 1994년04월11일(월) 13시58분49초 KST
제 목(Title): [R] gcc의 lib 함수 질문 (411)



> FD_ZERO, FD_SET,FD_ISSET등을 몬찾겠다고 나오네용..
> 위에 나와있는 펑션들이..어떻게 사용되는 것인지...
> 흠..그리구 무슨 라이브러리를 연결시켜야 하는지를요:(



말씀하신 질문의 요지를 제가 잘 파악하고 있는지는 모르겠구요...

제가 알고 있기에는 위의 것들(FD_ZERO, FD_SET,FD_ISSET)은 유닉스 시스템 콜인
select()와 연관되어 사용됩니다.


select()는 파라메터에서 지정된 여러 개의 fd(file descriptor)값을 지정된 시간
동안 지켜보고 있다가 ready(예를들면 키가 눌려 졌다든지...)가 된 화일이 존재하면
ready된 화일의 갯수를 리턴하고,

이후 사용자(programmer)는 원하는 화일이 ready 상태인가를 판단하여 read(),
write()등의 원하는 I/O를 사용합니다.


이때 파라메터로 사용하는 변수가 
        typedef long    fd_mask;
        typedef struct fd_set {
                fd_mask fds_bits[ ... ];
        } fd_set;
        와 같은 식으로 array로 정의 되어있고, 감시(?)를 원하는 화일의 fd값에
        대응하는 비트 위치에 '1'로 세트하여 사용하기 때문에, bit 연산을 하는
        것이 약간 복잡하게 됩니다. 따라서 프로그래머들이 쉽게 사용할 수 있도록
        만들어 놓은 것이 있을 수 있는데, 이들이 FD_ZERO, FD_SET, FD_CLR,
        FD_ISSET입니다.

        먼저 파라메터로 사용되는 변수를 0으로 clear하는 것이
        FD_ZERO이고, fd값에 해당하는 비트위치에 set하는 것이 FD_SET,
        해당 비트위치를 clear하는 것이 FD_CLR, 그리고
        해당 비트가 set되어 있는지 테스트하는 것이 FD_ISSET입니다.

일반적으로 FD_ZERO, FD_SET, FD_CLR, FD_ISSET을 <sys/types.h>에 매크로로
정의하여 사용합니다.


==============================================================================
그러므로 말씀하신 에러 메시지는 해당 헤더화일이 include되지 않아서
컴파일러가 펑션처럼 링커에게 떠미는 결과를 가져오게 되어,
링크할 때 마치 FD_ZERO, FD_SET, FD_CLR, FD_ISSET 펑션이 없는 것처럼
나오는 것으로서 라이브러리와는 무관하리라 생각됩니다.
include path나 define된 flag(메크로)를 살펴보시는 것이 좋을 듯합니다.
==============================================================================

자세한 것은 select()에 관한 메뉴얼과 <sys/types.h>를 참조하세요.



<< select콜과 FD_XXXX의 간단한 사용예 >>

{
        fd_set  readfds;
        int     maxfds, num_found;
        struct  timeval timeout;
        int     fd1, fd2;

        ...


        fd1 = open( ... );
        fd2 = open( ... );

        maxfds = fd2 + 1;
        tileout.tv_sec = 0;
        tileout.tv_usec = 1;    /* 1 micro-second */

        FD_ZERO(&readfds);
        while (1) {
                FD_SET(fd1, &readfds);
                FD_SET(fd2, &readfds);

                num_found = select(maxfds, &readfds, NULL, NULL, &timeout);
                if (num_found < 1) {
                        continue;
                }

                if (FD_ISSET(fd1, &readfds)) {
                        size = read(fd1, buf, BUFSIZ);
                        ...
                }

                if (FD_ISSET(fd2, &readfds)) {
                        size = read(fd2, buf2, BUFSIZ);
                        ...
                }
        }
}


하여튼 끝까지 읽어 주셔서 정말 정말 감사드리고요,
제가 아는 한도 내에서 적었기 때문에 제대로 표현하지 못한 것이
많으리라 생각됩니다.

부족한 것 있으면 고쳐주세요.

히.... 혹시 자다가 남의 다리 긁은 게 아닌지요 ...
                                                        

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.