запись файлов на низком уровне - PullRequest
0 голосов
/ 25 января 2019

Я читал учебное пособие по программированию GNU C онлайн, и у меня возникла путаница с примером кода для низкоуровневого чтения и записи.

Код следующий:

#include <stdio.h>
#include <fcntl.h>

int main()
{
  char my_write_str[] = "1234567890";
  char my_read_str[100];
  char my_filename[] = "snazzyjazz.txt";
  int my_file_descriptor, close_err;

  /* Open the file.  Clobber it if it exists. */
  my_file_descriptor = open (my_filename, O_RDWR | O_CREAT | O_TRUNC);

 /* Write 10 bytes of data and make sure it's written */
 write (my_file_descriptor, (void *) my_write_str, 10);
 fsync (my_file_descriptor);

 /* Seek the beginning of the file */
 lseek (my_file_descriptor, 0, SEEK_SET);

 /* Read 10 bytes of data */
 read (my_file_descriptor, (void *) my_read_str, 10);

 /* Terminate the data we've read with a null character */
 my_read_str[10] = '\0';

 printf ("String read = %s.\n", my_read_str);

 close (my_file_descriptor);

 return 0;
}

Я скомпилировал код с gcc без проблем. И запустить в первый раз, это тоже нормально. Вывод, как показано ниже:

$ ./lowLevelWrite
String read = 1234567890.

Проблема возникает, когда я запускаю программу во второй раз:

$ ./lowLevelWrite
String read = .

Кажется, что код не может записать строку "1234567890" во второй раз. Как мы знаем из руководства по GNU C, O_RDWR | O_CREAT | O_TRUNC этот флаг должен позволять нам каждый раз обрезать файл до 0, а затем записывать в файл. Я не уверен, почему это терпит неудачу от второго выполнения.

Кто-нибудь может мне помочь из этой путаницы?

1 Ответ

0 голосов
/ 25 января 2019

Когда вы создаете файл с open(), вам нужно передать третий аргумент, режимы разрешений:

my_file_descriptor = open (my_filename, O_RDWR | O_CREAT | O_TRUNC, 0664);

0664 - это разрешения rw-rw-r--: для чтения и записи с помощьювладелец и группа, доступная для чтения всем остальным.Эти разрешения будут дополнительно маскироваться вашим umask.

Поскольку вы не передали этот аргумент, open() использовал случайный мусор стека, и это, вероятно, не включало разрешение на запись.Таким образом, вы не можете открыть файл для записи, когда он уже существует.

...