On Tue, 10 Oct 2006, Anthony E. Caudel wrote: > I have been using Gentoo for more than 2 years now and have always > wondered (but never asked - That's the "dumb" part) how Gentoo manages > to update a package that happens to be running at the time. > > Given that the old version (the one running) is deleted, how does it > manage to keep standing if you just cut its legs off?
Userspace technically never "deletes" anything in the UNIX model; it either "truncates" it (not what's going on here) or it "unlinks" it. "Unlink" causes the file not to have the filename any more, and the kernel gets rid of files which aren't in use and have no name (of course, nobody can tell when or if this happens, aside from the disk not filling up, because there would be no way to look at the file anyway). If you look at /proc/<PID>/maps for a program you've upgraded, you'll probably find funny notations in there, indicating that the file it's using is not the file that currently has that filename. ("truncate" and otherwise openning the file for writing actually affect the file, not the filename, and would therefore cause programs to crash if you overwrote them.) Technical terms: the file itself is called an "inode", and the name is a "dentry" (actually, the last part of the path, which is all that goes away in a single operation, is the dentry). A dentry stores the inode number of the inode at that path, and "unlink" removes the dentry. What's actually happening in an upgrade is "rename", which, as a single operation, unlinks any dentry with the destination path, links the source inode to the destination dentry, and unlinks the source dentry. This means that no program can see the path empty or with half of a file or see the file with two names. -Daniel *This .sig left intentionally blank* -- gentoo-user@gentoo.org mailing list