linux 自动截断 文件,在使用文件时截断文件(Linux)

Jonathan Lef..

27

这些重新生成文件的有趣之处在于,在通过复制文件截断文件后,前128 KB左右将全部为零/dev/null.发生这种情况是因为文件被截断为零长度,但应用程序中的文件描述符仍然在其最后一次写入后立即指向.当它再次写入时,文件系统将文件的开头视为所有零字节 - 而不实际将零写入磁盘.

理想情况下,您应该要求应用程序的供应商使用该O_APPEND标志打开日志文件.这意味着在截断文件后,下一次写入将隐式地寻找文件的末尾(意味着返回到零偏移),然后写入新信息.

这个代码装备了标准输出,因此它处于O_APPEND模式状态,然后调用其参数给出的命令(比如nice在调整其良好级别nohup后运行命令,或者在修复之后运行命令,因此它忽略了SIGHUP).

#include

#include

#include

#include

#include

#include

#include

static char *arg0 = "";

static void error(const char *fmt, ...)

{

va_list args;

int errnum = errno;

fprintf(stderr, "%s: ", arg0);

va_start(args, fmt);

vfprintf(stderr, fmt, args);

va_end(args);

if (errnum != 0)

fprintf(stderr, " (%d: %s)", errnum, strerror(errnum));

putc('\n', stderr);

fflush(0);

exit(1);

}

int main(int argc, char **argv)

{

int attr;

arg0 = argv[0];

if (argc < 2)

error("Usage: %s cmd [arg ...]", arg0);

if ((attr = fcntl(1, F_GETFL, &attr)) < 0)

error("fcntl(F_GETFL) failed");

attr |= O_APPEND;

if (fcntl(1, F_SETFL, attr) != 0)

error("fcntl(F_SETFL) failed");

execvp(argv[1], &argv[1]);

error("failed to exec %s", argv[1]);

return(1);

}

我对它的测试有点随意,但几乎不足以说服我它有效.

更简单的选择

Billy在他的回答中指出' >>'是附加运算符 - 事实上,在Solaris 10上,bash(版本3.00.16(1))确实使用了O_APPEND标志 - 从而使上面的代码不必要,如图所示('Black JL:'是我在这台机器上的提示):

Black JL: truss -o bash.truss bash -c "echo Hi >> x3.29"

Black JL: grep open bash.truss

open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT

open("/usr/lib/libcurses.so.1", O_RDONLY) = 3

open("/usr/lib/libsocket.so.1", O_RDONLY) = 3

open("/usr/lib/libnsl.so.1", O_RDONLY) = 3

open("/usr/lib/libdl.so.1", O_RDONLY) = 3

open("/usr/lib/libc.so.1", O_RDONLY) = 3

open("/platform/SUNW,Ultra-4/lib/libc_psr.so.1", O_RDONLY) = 3

open64("/dev/tty", O_RDWR|O_NONBLOCK) = 3

stat64("/usr/openssl/v0.9.8e/bin/bash", 0xFFBFF2A8) Err#2 ENOENT

open64("x3.29", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3

Black JL:

使用追加重定向而不是上面的包装器(' cantrip ')代码.这只是表明当你将一种特定技术用于其他(有效)目的时,将其适用于另一种技术并不一定是最简单的机制 - 即使它有效.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值