[ 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); ... } } } 하여튼 끝까지 읽어 주셔서 정말 정말 감사드리고요, 제가 아는 한도 내에서 적었기 때문에 제대로 표현하지 못한 것이 많으리라 생각됩니다. 부족한 것 있으면 고쳐주세요. 히.... 혹시 자다가 남의 다리 긁은 게 아닌지요 ... |