低级写入文件

时间:2019-01-25 00:54:24

标签: c low-level-io

我正在在线阅读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 :(得分:5)

使用open()创建文件时,您需要传递第三个参数,即权限模式:

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

0664是权限rw-rw-r--:所有者和组可以读取和写入,其他任何人都可以读取。您的umask将进一步掩盖这些权限。

由于您没有传递此参数,因此open()使用了随机堆栈垃圾,并且这可能不包含写许可权。因此,当文件已经存在时,您将无法打开该文件进行写入。