了解文件截断

Sam*_*uns 3 c unix linux truncate file

引自Advanced Programming in the UNIX Environnement(第505页)第13.6节:

我们需要截断该文件,因为守护进程的前一个实例可能有一个比我们大的进程ID,并且字符串长度更长.例如,如果守护进程的前一个实例是进程ID 12345,而新实例是进程ID 9999,那么当我们将进程ID写入文件时,我们将在文件中留下99995.截断文件会阻止前一个守护程序中的数据显示为应用于当前守护程序.

这个评论是在这个功能上做出的:

already_running(void)
{
    int fd;
    char buf[16];
    fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE);
    if (fd < 0) {
        syslog(LOG_ERR, "can't open %s: %s", LOCKFILE, strerror(errno));
        exit(1);
    }
    if (lockfile(fd) < 0) {
        if (errno == EACCES || errno == EAGAIN) {
            close(fd);
            return(1);
        }
        syslog(LOG_ERR, "can't lock %s: %s", LOCKFILE, strerror(errno));
        exit(1);
    }
    ftruncate(fd, 0);
    sprintf(buf, "%ld", (long)getpid()); 
    write(fd, buf, strlen(buf)+1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白这种行为是如何可能的,以及文件截断如何防止这种行为发生.有人可以解释一下吗?

谢谢回答!

小智 5

在上面的示例中,文件最初为5个字节.当你打开它的文字,并写字符串"9999"来了,但不截断,它只是简单地覆盖前4个字节,并留在原地的第5个字节.因此该文件将显示为"99995".截断将文件长度设置为0,从而有效地删除先前的内容.