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

Reply via email to