Быстрый вопрос о creat () Режим системных вызовов Аргумент - PullRequest
0 голосов
/ 23 января 2020

Для проекта в моем классе у меня возникли проблемы с чтением файла, который я создал с помощью системного вызова creat (). Насколько я понимаю, creat () используется только для записи. С тех пор я изменил свой код для создания этого файла с помощью open (), поэтому мой вопрос просто из любопытства. Какой смысл в аргументе mode тогда? Первоначально я побитовый ORd разрешение на чтение и запись, и файловый дескриптор будет показывать, что у него есть эти разрешения, но когда я прочитал файл, я получил -1 возвращаемое значение. Просто странно для меня. Я также нашел этот код в руководстве, поэтому я в замешательстве. Зачем давать разрешение на чтение файла, когда моя программа не может его прочитать, но в то же время дескриптор показывает, что файл имеет разрешение на чтение?

#include <fcntl.h>

int fd;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
char *filename = "/tmp/file";
fd = creat(filename, mode);

1 Ответ

1 голос
/ 23 января 2020

Из руководства :

creat () эквивалентно open () с флагами, равными O_CREAT | O_WRONLY | O_TRUN C.

Из-за O_WRONLY файл открывается только в режиме записи.

Использование open:

mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
char *filename = "/tmp/file";
fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, mode);

Зачем давать файл разрешение на чтение, когда моя программа не может его прочитать, но в то же время дескриптор показывает, что файл имеет разрешение на чтение?

Права доступа к файлам отличаются от режима, в котором был открыт дескриптор файла. Файл создается с разрешениями на чтение, поэтому вы можете открыть его для чтения, но вы открываете файл только в режиме записи. Откройте его для чтения и записи с флагом O_RDWR.

...