2016-08-24 4 views
2

私のOSは64ビットCentOS6.4です。その後linuxのFD_SETとfd_setについて

fd_set my_set; 
FD_SET(31, &my_set); 

、私は[...] my_set.fds_bitsを示しmy_set.fds_bits [0] 0x0000000080000000に等しいです:私はFD_SETを管理FD_SETする方法についての質問fd.Followコードがケースで追加しています。 、my_set.fds_bits [1〜...] zero.Iは、私はまた、コードに従って、ケースを書くresult.Butを理解することができます:。私は[...] my_set.fds_bitsを示し

fd_set my_set; 
FD_SET(63, &my_set); 

をmy_set .fds_bits [0]は0x0と等しいです。私の意見では、結果はmy_set.fds_bits [0]は0x8000000000000000と等しいです。本当になぜsencondの結果が0x0なのかわかりません。 63に等しいfdはmy_setに状態を持たない。あなたはおそらく、32ビットのようにコードをコンパイルし

#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; 
} 
+0

'printf(" size =%zu \ n "、sizeof __FDS_BITS(&my_set)[0])の出力は何ですか? – Armali

+0

@ Armali、結果は8です。 –

+0

面白い... 2番目の結果を(どのように試してみるために)正確にどのように印刷しましたか? – Armali

答えて

1

my_setには63のfdはありません。

です。 printf書式文字列に長さ修飾子lを忘れてしまったため、値を正しく印刷できませんでした。

 printf("0x%016lx\t", __FDS_BITS(&target_sets)[uIndex]); 
+0

、ああ、私はそれを得た。 printf関数の書式文字列が見つかりませんでした。ありがとうございました! –

0

はここで完全なテストコードです。 set.fds_bitsはlong intの配列です。 my_set.fds_bits [1]の値を確認してください。

+1

、-m64を使用してプログラムをコンパイルしました。結果は変更されません。 –

関連する問題