c语言o_append的用法,c - 当同时指定O_APPEND和O_TRUNC时,它不会被截断?

作为标题,当指定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”中的哪一个? –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值