在低级别写入文件
writing files at a low level
我正在在线阅读 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] = '[=10=]';
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
这些标志应该允许我们每次都将文件 t运行 归为 0,然后写入文件。我不确定为什么第二次执行失败。
谁能帮我解决这个困惑?
当您使用 open()
创建文件时,您需要传递第三个参数,权限模式:
my_file_descriptor = open (my_filename, O_RDWR | O_CREAT | O_TRUNC, 0664);
0664
是权限rw-rw-r--
:所有者和组可读可写,其他人可读。这些权限将被您的 umask
.
进一步屏蔽
由于您没有传递此参数,open()
使用了随机堆栈垃圾,这可能不包括写权限。所以当文件已经存在时你不能打开它进行写入。
我正在在线阅读 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] = '[=10=]';
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
这些标志应该允许我们每次都将文件 t运行 归为 0,然后写入文件。我不确定为什么第二次执行失败。
谁能帮我解决这个困惑?
当您使用 open()
创建文件时,您需要传递第三个参数,权限模式:
my_file_descriptor = open (my_filename, O_RDWR | O_CREAT | O_TRUNC, 0664);
0664
是权限rw-rw-r--
:所有者和组可读可写,其他人可读。这些权限将被您的 umask
.
由于您没有传递此参数,open()
使用了随机堆栈垃圾,这可能不包括写权限。所以当文件已经存在时你不能打开它进行写入。