在linux內核編程中,有沒有辦法檢查特定文件描述符是否在給定進程中使用,或者它是否可用?Linux內核 - 檢查是否有文件描述符
1
A
回答
0
如果你真的在編程Linux內核,那麼你會看到連接到你有興趣在這個過程中的task_struct
的files_struct
。
但我想你的意思是你'使用內核API編寫用戶空間程序以在 Linux上運行。在這種情況下,這有點困難。
沒有直接的方式來做到這一點,我知道。但是,您應該可以使用fcntl
做一點小事。基本上,您可以查詢文件描述符的狀態標誌,並且如果出現錯誤(或多或少),則說明文件描述符無效 - 因此可用。
但是,如果你有多個線程它是活潑的。另一個線程可以在檢查完文件後使用文件描述符。如果你真的想要使用該文件描述符,可能需要dup2()
或F_DUPFD
,但我不確定你實際上想要做什麼。
示例代碼:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int main(void)
{
int rc, fd;
for (fd = 0; fd < 8; fd++) {
errno = 0;
rc = fcntl(fd, F_GETFL);
if (rc >= 0)
printf("fd %d is open\n", fd);
else if (errno == EBADF)
printf("fd %d is closed\n", fd);
else
printf("error %d querying fd %d \n", errno, fd);
}
return 0;
}
2
是的,你可以測試:
struct files_struct * files = task->files;
struct fdtable *fdt;
spin_lock(&files->file_lock);
fdt = files_fdtable(files);
if (test_bit(fd, fdt->open_fds->fds_bits))
{
/* fd is in use */
}
spin_unlock(&files->file_lock);
然而,信息是可能過時,只要你解開files
結構,所以,真正的問題你會用它做什麼?
1
假設你是在內核和有結構的task_struct * PROC進程上下文,你只需要檢查給FD對應於這一過程中打開文件,而不是實際使用莫名其妙的文件:
int is_valid_fd_for_process(int fd, struct task_struct* proc)
{
int exists;
rcu_read_lock();
exists = (NULL != fcheck_files(proc->files, fd));
rcu_read_unlock();
return exists;
}
如果你真的想使用文件結構,這個FD地址或以後存儲它,你應該獲得它的參考。請參閱fget的代碼,它可以爲當前進程做到這一點,並將其適用於任何進程。
相關問題
- 1. Linux系統:檢查是否文件描述符可以讀取
- 2. 檢查文件描述符是否有效
- 3. Linux內核 - 套接字文件描述符關閉位置
- 4. 檢查IniFile描述符是否打開
- 5. Linux open()文件描述符
- 6. 檢查套接字文件描述符是否可用?
- 7. 從Linux內核模塊的文件描述符中獲取文件名/路徑?
- 8. 是否EXEC保存文件描述符
- 9. fopen是否創建文件描述符?
- 10. 如何檢查文件描述符是否有可用的數據?
- 11. 如何檢查文件是否仍然存在使用文件描述符
- 12. 實現文件描述符
- 13. 如何檢查Expressionengine 2中的文件描述是否爲空?
- 14. 檢索文件描述符:: fstream的
- 15. Linux文件描述符日誌
- 16. Linux文件描述符表和vmalloc
- 17. Linux Socket文件描述符與線程
- 18. linux內核何時文件描述符無法通過pread訪問?
- 19. 瞭解用於處理文件描述符的linux內核數據結構
- 20. 確定文件結構(描述文件描述符)是否爲'特殊文件'(即塊/字符設備)
- 21. Linux內核編程:列出所有打開的套接字文件描述符,並檢索相關信息
- 22. 文件描述符飢餓和阻斷文件描述符
- 23. 在Linux中創建新線程是否重複文件描述符和套接字描述符?
- 24. 如何確定文件描述符是否可查找?
- 25. 內核日誌「文件描述符」用於select?
- 26. 調試文件描述符泄漏(在內核?)
- 27. Linux:使用文件描述符查找閃存流
- 28. 查找進程linux(C代碼)的打開文件描述符?
- 29. lttng內核事件的描述
- 30. linux編程:文件描述符的值總是3
+1最後一句。 – 2011-02-11 23:53:55