2016-02-05 321 views
0

如果我想使用其他類型數據流,如插座沿着一個物理文件,我可以簡單地轉換的文件句柄到文件描述符:創建GNU C文件描述符沒有文件句柄

#include <stdlib.h> 
#include <stdio.h> 

int main(void) { 
     FILE *f = fopen("uniquefilename.ext", "w"); 
     int fd = fileno(f); 
     printf("%d\n", fd); 
     fclose(f); 
     return 0; 
} 

不GNU標準庫提供了一種直接獲取物理文件描述符的方法?東西的效果:

int fd = some_call("file_name.ext", "mode"); 

看來我需要說明,我完全知道如何描述符是不是隱含綁定到任何特定的文件。當我寫下「獲取物理文件的描述符」時,我誤導了;我應該寫的東西就像「創建一個描述符來訪問特定的物理文件」。

+1

物理文件沒有文件描述符。 –

+0

@凱特湯普森好悲傷 – motoku

+0

這是什麼意思?文件描述符可以與物理文件相關聯 - 就此而言,多個文件描述符可以與給定的物理文件相關聯(在同一進程內)。如果你正在尋找'open()'調用,它會*分配一個新的文件描述符並將它與指定的物理文件關聯起來。 –

回答

2

它沒有。

但是,您可以直接使用open函數!這是Linux本身的一部分,而不是C標準庫(從技術上說,C標準庫提供了一個小包裝,允許您將其稱爲C函數)。

用法示例:

int fd = open("file_name.ext", O_RDWR); // not fopen 
// do stuff with fd 
close(fd); // not fclose 

注:該名男子頁建議,包括<sys/types.h><sys/stat.h><fcntl.h>,和close你需要<unistd.h>。這是相當多的標題,我不知道它們是否都是必要的。

+0

還要注意,Windows *沒有*文件描述符,除非標準庫模擬它們。 – immibis

+0

謝謝!我知道我通常使用'unistd.h',因爲'read'和'write'。 – motoku

+0

是的,我使用cygwin或debian。我很久以前就停止了安裝windows sdks的打擾 – motoku