2016-03-18 8 views
1

Я учусь о модулях ядра, сообщающихся с программами на уровне пользователя и первоначально открытие файла сC альтернатива fputs()/fgets() с открытым()

FILE *pFile = fopen(...) 

и писать к нему с

char *str = malloc(10); 
fputs(str, pFile); 

Однако теперь мне нужно использовать функциональные возможности в #include <fcntl.h> попытки некоторых асинхронных уведомлений и пример, который я вместо этого использует

int pFile; 
pFile = open("/dev/mymodule", O_RDWR); 

Я думаю, что я больше не могу использовать fputs() или fgets(), потому что для этого требуется FILE *ptr, и теперь у меня есть int. Я думаю, что я должен использовать вместо этого write() и read().

Как это работает?

write(pFile, str, sizeof(str)); 

char line[256]; 
    while (read(pFile, line, 256) != NULL) { 
      printf("%s", line); 
     } 
+0

'read' не возвращает' NULL'. Проверьте его документацию. – edmz

ответ

5

Вы можете открыть FILE* на основе дескриптора файла с fdopen():

FILE *file = fdopen(pfile, "rw"); 

Ссылка: fdopen - associate a stream with a file descriptor

+0

это позволяет мне использовать fputs/fgets и такие вещи, как: 'fcntl (pFile, F_SETOWN, getpid()); filp-> f_owner \t oflags = fcntl (pFile, F_GETFL); \t fcntl (pFile, F_SETFL, oflags | FASYNC); '? – Austin

+0

Ой, думаю, я понял, спасибо. – Austin

+3

Вы можете использовать 'fgets()' и 'fputs()' на 'FILE *' и 'fcntl()' на 'int'. Просто не смешивайте чтение и запись 'FILE *' при чтении и записи 'int', так как' FILE * 'буферизуется, а' int' - нет, поэтому ситуация перестанет синхронизироваться. –

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

  • Нет связанных вопросов^_^