我的操作系统是64位Centos6.4。 我有一个关于如何fd_setpipe理FD_SET的问题添加fd.Follow代码是这样的:
fd_set my_set; FD_SET(31, &my_set);
然后,我显示my_set.fds_bits […]。my_set.fds_bits [0]等于0x0000000080000000,my_set.fds_bits [1〜…]为零。我可以理解结果。但是我也写一个case ,关注代码:
fd_set my_set; FD_SET(63, &my_set);
我显示my_set.fds_bits […]。my_set.fds_bits [0]等于0x0。在我看来,结果应该是my_set.fds_bits [0]等于0x8000000000000000.我真的不明白为什么第二结果是0x0。 不是等于63的fd在my_set中有一个状态。
这里是完整的testing代码:
#include <stdio.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <resolv.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> #include <sys/time.h> #include <pthread.h> #define BUFSIZE 1024 void printFDSET(fd_set target_sets) { int uIndex = 0; int model_num = __NFDBITS; for(uIndex = 0; uIndex < 10/*FD_SETSIZE/model_num*/; uIndex++) { printf("0x%016x\t", target_sets.fds_bits[uIndex]); if(uIndex % 4 == 3) printf("\n"); } printf("\n"); return; } int main(int argc, char* argv[]) { fd_set my_set; FD_ZERO(&my_set); printf("sizeof(long int) = %d\n", sizeof(long int)); printf("FD_SETSIZE = %d\n", FD_SETSIZE); printf("size = %zu\n", sizeof __FDS_BITS(&my_set)[0]); printf("\n\n"); int unfd = 31; FD_SET(unfd, &my_set); printf("%d is added to my_set:\n", unfd); printFDSET(my_set); printf("\n\n"); FD_CLR(unfd, &my_set); unfd = 63; printf("%d is added to my_set:\n", unfd); FD_SET(unfd, &my_set); printFDSET(my_set); return 0; }
不是等于63的fd在my_set中有一个状态。
它有。 你只是没有正确地打印这个值,因为你忘记了printf
格式字符串中的长度修饰符l
。
printf("0x%016lx\t", __FDS_BITS(&target_sets)[uIndex]);
你可能编译你的代码为32位。 set.fds_bits是一个long int的数组。 检查my_set.fds_bits的值[1]