Запись файлов на низком уровне
Я читал учебное пособие по программированию 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()
использовал случайный мусор стека, и это, вероятно, не включало разрешение на запись. Таким образом, вы не можете открыть файл для записи, когда он уже существует.