在 Beej’s Guide 看到這一句話:select() only works with socket descriptors, not file descriptors (like 0 for stdin),想到我之前曾經把 tun/tap 的 file descriptor 丟進 select 裡面,不曉得我是不是做錯了。於是開始了一連串的搜尋,想要搞清楚 select 到底可以接受哪些 file descriptor…
大約花了快兩天的時間,我把相關的關鍵字都搜尋了一遍,然後把 man 2 select 與 man 2 select_tut 也看完了,接著跑去找出之前的程式,確認 tun/tap 並不是 socket descriptor 但是程式卻正常運作….
最後翻出手邊的 Linux 系統程式設計 這本書,把第二章重新看了一遍,發現書中直接就拿 STDIN_FILENO 丟進 select 來當範例。
嗯…難道是 Beej 亂寫嗎?
跑回去看那一篇文章,才發現他寫的是 Note for Windows Programmers 也就是說其實指的是 Winsock 的情況。
算了,反正看了那堆東西我還是有點收穫的,其中之一就是這個,如何判斷 fd 的種類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
; html-script: false ] static void TestFD(int fd) { struct stat statbuf; fstat(fd, &statbuf); if(S_ISBLK(statbuf.st_mode)) { printf("S_ISBLK %d\n", fd); } else if(S_ISCHR(statbuf.st_mode)) { printf("S_ISCHR %d\n", fd); } else if(S_ISDIR(statbuf.st_mode)) { printf("S_ISDIR %d\n", fd); } else if(S_ISFIFO(statbuf.st_mode)) { printf("S_ISFIFO %d\n", fd); } else if(S_ISREG(statbuf.st_mode)) { printf("S_ISREG %d\n", fd); } else if(S_ISLNK(statbuf.st_mode)) { printf("S_ISLNK %d\n", fd); } else if(S_ISSOCK(statbuf.st_mode)) { printf("S_ISSOCK %d\n", fd); } } |
參考:http://pubs.opengroup.org/onlinepubs/009695399/functions/fstat.html