【问题标题】:"creat" System Call in UnixUnix 中的“创建”系统调用
【发布时间】:2015-08-27 09:45:59
【问题描述】:

我正在使用 creat 系统调用来创建文件。以下是创建文件的程序

#include<stdio.h>
#include<fcntl.h>
void main()
{
    int fd=creat("a.txt",S_IRWXU|S_IWUSR|S_IRGRP|S_IROTH);
    printf("fd  = %d\n",fd);
}

所以,第一次,程序会创建一个名为 a.txt 的文件,并具有适当的权限。如果我再执行一次 a.out,就会创建新的 a.txt。但是,文件的 inode 保持不变。怎么样,会怎么样。

$ ./a.out
fd  = 3
$ ls -li a.txt
2444 -rw-r--r-- 1 mohanraj mohanraj 0 Aug 27 15:02 a.txt
$ cat>a.txt
this is file a.txt
$ ./a.out
fd  = 3
$ cat a.txt
$ls -li a.txt
2444 -rw-r--r-- 1 mohanraj mohanraj 0 Aug 27 15:02 a.txt
$

在上面的输出中,a.txt 的内容为“这是文件 a.txt”。一旦我执行了 a.out,就创建了新的 a.txt。但是,inode 2444 保持不变。那么,creat 系统调用是如何工作的呢?

提前致谢。

【问题讨论】:

  • 第二次“创建”时该文件已经存在,因此被截断并保持相同的inode编号。
  • 来自手册页:creat() is equivalent to open() with flags equal to O_CREAT|O_WRONLY|O_TRUNC

标签: c linux unix system-calls


【解决方案1】:

creat 仅在文件不存在时创建文件。如果它已经存在,它只是被截断。

creat(filename, mode);

等价于

open(filename, O_WRONLY|O_CREAT|O_TRUNC, mode);

如open(2) 文档中所指定:

O_CREAT
如果文件不存在,则会创建它。

【讨论】:

  • 官方 Linux 手册页在这里:man7.org/linux/man-pages/man2/open.2.html
  • 我知道,对我来说也一样,但这并没有提高 linux.die.net 的质量 ... :-/。所以我在为(Linux)手册页添加 gxxgling 时总是添加“man7”。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2011-06-13
  • 2023-04-09
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多