簡體   English   中英

是否有系統調用或某種方式來了解 Linux 中文件描述符的類型(例如常規文件 fd、套接字 fd、信號 fd、計時器 fd)?

[英]Is there a system call or some way to know the type of file descriptor in Linux (e.g. regular file fd, socket fd, signal fd, timer fd)?

正如我不斷發現的那樣,有各種各樣的文件描述符 - 幾乎所有東西都圍繞文件描述符抽象:常規文件、套接字、信號和計時器(例如)。 所有文件描述符都只是整數。

給定一個文件描述符,是否有可能知道它是什么類型? 例如,有一個像 getFdType(fd) 這樣的系統調用會很好。

如果由於多個文件描述符准備就緒而喚醒 epoll_wait,則每個文件描述符的處理將基於其類型。 這就是我需要類型的原因。

當然,我可以自己單獨維護這些信息,但讓系統支持它會更方便。

此外,無論類型如何,所有文件描述符都是連續的。 我的意思是,如果您打開一個常規數據文件,然后創建一個計時器文件描述符,然后創建一個信號文件描述符,它們是否都保證按順序編號?

正如“那個其他人”所提到的,最明顯的此類調用是fstat st_mode成員包含用於區分常規文件、設備、套接字、管道等的位。

但在實踐中,您幾乎肯定需要自己跟蹤哪個 fd 是哪個。 當您打開多個不同的常規文件時,知道它是一個常規文件並沒有太大幫助。 因此,既然您無論如何都必須在代碼中的某處維護此信息,那么回溯該記錄似乎是最可靠的方法。

(檢查程序中的某些變量也比進行一個或幾個額外的系統調用要快得多。)

此外,無論類型如何,所有文件描述符都是連續的。 我的意思是,如果您打開一個常規數據文件,然后創建一個計時器文件描述符,然后創建一個信號文件描述符,它們是否都保證按順序編號?

並不真地。

據我所知,創建新 fd 的調用將始終返回編號最低的可用 fd。 有一些舊程序依賴於這種行為; dup2存在之前,我相信將標准輸入移動到新文件的公認方法是close(0); open("myfile", ...); close(0); open("myfile", ...); .

然而,很難真正確定哪些 fds 可用。 例如,用戶可能以/usr/bin/prog 5>/some/file/somewhere運行你的程序,然后看起來 fd 5 被跳過了,因為/some/file/somewhere已經在 fd 5 上打開了。因此,如果您連續打開一堆文件,則無法真正確定您將獲得連續的 fd,除非您自己剛剛關閉了所有這些 fd 並且確定所有編號較低的 fd 都已在使用中。 這樣做似乎比首先跟蹤 fds 更麻煩(也是潛在問題的根源)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM