從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,這樣就不可能在文件的新版本中存在任何以前的內容(如果之前的內容大於新內容,可能會發生這種情況)。 –
是的,但只有在您要覆蓋現有文件時纔有必要,並且新內容可能會比舊內容短。否則它是多餘的(但無害)。 –