- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定以下代码(应该在“helloworld”文件中写入“helloworld”,然后读取文本):
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FNAME "helloworld"
int main(){
int filedes, nbytes;
char buf[128];
/* Creates a file */
if((filedes=open(FNAME, O_CREAT | O_EXCL | O_WRONLY | O_APPEND,
S_IRUSR | S_IWUSR)) == -1){
write(2, "Error1\n", 7);
}
/* Writes hello world to file */
if(write(filedes, FNAME, 10) != 10)
write(2, "Error2\n", 7);
/* Close file */
close(filedes);
if((filedes = open(FNAME, O_RDONLY))==-1)
write(2, "Error3\n", 7);
/* Prints file contents on screen */
if((nbytes=read(filedes, buf, 128)) == -1)
write(2, "Error4\n", 7);
if(write(1, buf, nbytes) != nbytes)
write(2, "Error5\n", 7);
/* Close file after read */
close(filedes);
return (0);
}
我第一次运行这个程序,输出是:
helloworld
之后每次运行程序,输出都是:
Error1
Error2
helloworld
我不明白为什么没有附加文本,因为我已经指定了 O_APPEND 文件。是因为我包含了 O_CREAT 吗?如果文件已经创建,难道不应该忽略 O_CREAT 吗?
最佳答案
O_EXCL
强制创建文件。如果文件已经存在,则调用失败。
它用于确保必须创建文件,并在第三个参数中传递给定的权限。简而言之,您有以下选择:
O_CREAT
:如果文件不存在,则创建具有给定权限的文件。如果文件存在,则打开它并忽略权限。O_CREAT | O_EXCL
:如果文件不存在,则创建具有给定权限的文件。如果文件存在,则失败。这对于创建锁定文件和保证对该文件的独占访问很有用(只要使用该文件的所有程序都遵循相同的协议(protocol))。O_CREAT | O_TRUNC
:如果文件不存在,则创建具有给定权限的文件。否则,将文件截断为零字节。当我们想到“创建一个新的空白文件”时,这会产生更多我们期望的效果。尽管如此,它仍然保留现有文件中已有的权限。更多信息来自 the manual page :
O_EXCL
When used with O_CREAT, if the file already exists it is an error and the open() will fail. In this context, a symbolic link exists, regardless of where it points to. O_EXCL is broken on NFS file systems; programs which rely on it for performing locking tasks will contain a race condition. The solution for performing atomic file locking using a lockfile is to create a unique file on the same file system (e.g., incorporating hostname and pid), use link(2) to make a link to the lockfile. If link() returns 0, the lock is successful. Otherwise, use stat(2) on the unique file to check if its link count has increased to 2, in which case the lock is also successful.
关于C 系统调用 open/read/write/close 和 O_CREAT|O_EXCL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572480/
我正在为 open(3) 中列出的不同文件标志编写一个安全的 enum class,当我发现我找不到写出的单词时对于 O_EXCL。 enum class Flags { readOnly,
在 Linux 上的 C 中有没有办法只写入一个已经存在的文件?换句话说,与 open(..., O_CREAT|O_EXCL) 相反。 请注意,我不希望存在性检查与文件的实际打开分离(例如预先调用
在 Linux 2.6 内核和 NFSv3 中,open("fname", O_CREAT|O_EXCL) 何时生效?当前规范的 open(2) 系统调用文档 ( http://www.kernel.
给定以下代码(应该在“helloworld”文件中写入“helloworld”,然后读取文本): #include #include #include #define FNAME "hellow
我正在将一些代码从 Win32 移植到使用锁定文件的 Linux。我用 open 为 Linux 做了一个实现,但我不确定如果文件在 Samba 共享上它是否会工作。我试过了,它似乎可以正常工作,但我
我是一名优秀的程序员,十分优秀!