2016-02-05 2 views
0

Если я хочу использовать физический файл вместе с другими типами потоков, таких как сокет, я могу просто преобразовать дескриптор файла в файл дескриптора:Создать GNU C File Descriptor Без файла Дескриптор

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

Does стандартная библиотека GNU обеспечивает способ получения дескриптора физического файла напрямую? Что-то эффект:

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

Кажется, мне нужно отметить, что я полностью в курсе того, как дескриптор не неявно связан с каким-либо конкретным файлом. Я вводил в заблуждение, когда писал «получить дескриптор физического файла»; то, что я должен был написать, это нечто вроде «создать дескриптор, позволяющий получить доступ к определенному физическому файлу».

+1

Физический файл не имеет дескриптора файла. –

+0

@KeithThompson хорошее горе – 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

Смежные вопросы