Запись файлов на низком уровне

Я читал учебное пособие по программированию 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам