Какая связь между fopen и open?

Я работаю над проектом для класса, и нам дали файл .c, содержащий следующий код:

int fd = -1;
if (fd < 0)
{
  fd = open ("my_dev", O_RDWR);
  if (fd < 0)
  {
    perror ("open");
    return -1;
  }
...

Итак, я понимаю, что он пытается открыть файл «my_dev» с разрешениями на чтение / запись, а затем возвращает дескриптор файла в случае успеха или отрицательное значение в случае неудачи, но я не понимаю, почему он дает мне «разрешение отклонено. " последовательно. Я пробовал использовать этот код:

int des = open("my_dev", O_CREAT | O_RDWR, 0777);
...
close(des)

чтобы открыть / создать файл (это вызывается перед другим блоком), но это не работает, и все же, если я просто использую это вместо этого:

FILE* file = fopen("my_dev","w+");
fprintf(file,str);
fclose(file);

Я могу писать в файл, то есть у меня есть права на запись. Обычно я бы просто использовал fopen и fprintf для всего, но для этого проекта мы вроде как должны использовать файл .c учителя, который будет пытаться использовать

 open()

что приведет к ошибке «В разрешении отказано», что, в свою очередь, испортит мой код.

Думаю, мой вопрос в том, как fopen и open относятся друг к другу? Кажется, каждый может повторить, что open - это системный вызов, тогда как fopen - это стандартная функция библиотеки, но я не могу найти четкого ответа на вопрос, как я могу создать файл с помощью fopen (), который можно открыть с помощью open () без ошибка "доступ запрещен", или как я могу создать файл с помощью open (), в который я затем могу записать, закрыть и снова открыть с помощью open ().

Короче говоря, как мне создать файл на C, в который я могу писать и открывать позже с помощью open (O_RDWR)?

Извините, если это немного по кусочкам, я очень устал.

PS: Следует отметить, что я компилирую и запускаю на университетском компьютере, поэтому разрешения могут быть «странными», НО следует отметить, что если я создам файл с помощью команды терминала, то команда «dd» open () будет работать, и более того , У меня явно есть НЕКОТОРЫЕ права на запись, так как я действительно могу писать в файл с помощью fopen и fprintf


person botch    schedule 25.04.2016    source источник
comment
В зависимости от операционной системы между этими функциями может не быть никаких отношений, кроме обоих открытых файлов.   -  person Some programmer dude    schedule 25.04.2016
comment
Связанный вопрос: stackoverflow.com/questions/1658476/c-fopen-vs-open   -  person Klas Lindbäck    schedule 25.04.2016


Ответы (1)


fopen - это библиотечная функция, предоставляемая стандартной средой выполнения C, она возвращает поток, и вы можете вызывать в нем потоковые функции, например fscanf, fprintf или fread, fwrite.

open - это обычно системный вызов в unix-подобных системах, предоставляемый ядром операционной системы, он возвращает дескриптор файла, вы можете вызывать функции ввода-вывода с помощью fd, например read, write.

Обычно fopen реализуется с использованием open подчеркивания.

Если вы хотите использовать стандартные функции потока для дескриптора файла, вы можете использовать posix api, fdopen, который принимает fd и возвращает поток FILE*.

person fluter    schedule 25.04.2016
comment
Я также пробовал FILE * file = fdopen (des, w +), который, по-видимому, даже не может записывать в файл. - person botch; 25.04.2016
comment
Перед вызовом des должен быть в O_WRONLY или O_RDWR. - person fluter; 25.04.2016
comment
AFAIK, если вы используете C, open также является библиотечной функцией. - person red0ct; 25.04.2016
comment
Все это зависит от платформы и реализации, например, glibc предоставляет оболочки для многих системных вызовов, иначе вы бы вызывали что-то вроде syscall (SYS_OPEN, file, mode) - person fluter; 25.04.2016