从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;
}
我不明白这是怎么可能的行为,以及文件截断如何防止发生这种行为。有人可以解释这一点吗?
感谢您的回答!
的调用' ftruncate'在重写文件之前将文件长度重置为0,这样就不可能在文件的新版本中存在任何以前的内容(如果之前的内容大于新内容,可能会发生这种情况)。 –
是的,但只有在您要覆盖现有文件时才有必要,并且新内容可能会比旧内容短。否则它是多余的(但无害)。 –