c - 在低级别写入文件

标签 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_TRUNC 这些标志应该允许我们每次都将文件截断为 0,然后写入文件。我不确定为什么第二次执行失败。

谁能帮我解决这个困惑?

最佳答案

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

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

0664 是权限rw-rw-r--:所有者和组可读和可写,其他人可读。您的 umask 将进一步屏蔽这些权限。

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

关于c - 在低级别写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54357573/

相关文章:

c - 在 C 中将文件内容打印到标准输出低级 I/O

c - 如何使用低级 write() 函数将字符串写入文件?

c++ - 如何将 write() 系统调用设置为 "flush"?

c - 是否可以实现2行代码在没有锁的多线程程序中始终按顺序出现?

c - 接受一个数字并打印其替代数字,

c - 重新分配期间出现段错误

c - MPI_Comm_size 始终返回 1

c - 如何使用指针访问存储在物理内存最后一个字节中的数据?