作为标题,当指定O_APPEND和O_TRUNC时,文件在打开时不会被截断。c - 当同时指定O_APPEND和O_TRUNC时,它不会被截断?
因此,当指定O_APPEND时,我该如何仍然可以先截断文件?
@Update:
O_APPEND和O_TRUNC做的工作完美地结合在一起,这是我在我前面的代码错误。
关于原子
下面的代码证明O_APPEND将确保追加操作中的每个write()是原子,通过设定偏移到atomical系统调用内自动结束。
// atomic append
// TLPI exercise 5.3
#include
#include
#include
#include
#include
#include
int atomic_append(int argc, char *argv[]) {
char *buf = "a";
int opt;
if(argc < 3) {
printf("command format: %s\n", "atomic_append [x]");
return -1;
}
char *fp = argv[1];
int bc = atoi(argv[2]);
int flag_append = 1;
if(argc >=4 && strcmp(argv[3], "x")==0) {
flag_append = 0;
}
int fd = open(fp, O_RDWR | O_CREAT | O_TRUNC | (flag_append?O_APPEND:0), 0644);
int i=0;
while(i++ < bc) {
if(!flag_append) {
lseek(fd, 0, SEEK_END);
}
write(fd, buf, 1);
}
close(fd);
return 0;
}
int main(int argc, char *argv[]) {
atomic_append(argc, argv);
return 0;
}
步骤编译并运行:
编译为a.out
./a.out a1 100000 & ./a.out a1 100000
./a.out a2 100000 x & ./a.out a2 100000 x
ll -h a*
然后你就可以看到A1和a2有不同的大小。
这是TLPI练习5.3的练习。
+0
什么文件存取方式是你指定? –
+0
@Mat我用'0644' –
+0
这是文件创建权限位。 “O_RDWR”,“O_RDONLY”中的哪一个? –