首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于linux中的FD_SET和fd_set

关于linux中的FD_SET和fd_set
EN

Stack Overflow用户
提问于 2016-08-24 13:33:06
回答 2查看 1.5K关注 0票数 2

我的操作系统是64位Centos6.4。我有一个关于如何fd_set管理FD_SET的问题,添加fd.Follow代码是这样的:

代码语言:javascript
复制
fd_set my_set;
FD_SET(31, &my_set);

然后,我证明了my_set.fds_bits....The my_set.fds_bits等于0x0000000080000000,my_set.fds_bits1~.我能理解result.But,我也写了一个例子,下面是代码:

代码语言:javascript
复制
fd_set my_set;
FD_SET(63, &my_set);

我证明了my_set.fds_bits....The my_set.fds_bits等于0x0。在我看来,结果应该是my_set.fds_bits等于0x800000000000000000。我真的不明白为什么sencond结果是0x0。等于63的fd在my_set中没有一个状态。

下面是完整的测试代码:

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-26 08:13:35

等于63的fd在my_set中没有一个状态。

确实是这样。您只是没有正确地打印值,因为您忘记了printf格式字符串中的长度修饰符printf

代码语言:javascript
复制
        printf("0x%016lx\t", __FDS_BITS(&target_sets)[uIndex]);
票数 1
EN

Stack Overflow用户

发布于 2016-08-25 08:45:19

您可能将代码编译为32位。set.fds_bits是一个长int数组。检查my_set.fds_bits1的值

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39124814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档