tags:

views:

534

answers:

2

Why do the statfs() and statvfs() calls both exist when they're so similar?

Under what circumstances would I prefer one over the other?

+5  A: 

Hysterical Raisins


Err, "historical reasons".

Originally 4.4BSD defined a statfs() call. Linux later implemented a slightly different call with the same name. Posix standardized it between all freenix and Unix versions by defining statvfs().

statfs() is OS-specific

statvfs() is posix-conforming

As they all return slightly different structures, later ones to come along can't replace the first.

In general you should use statvfs(), the Posix one. Be careful about "use Posix" advice, though, as in some cases (pty, for example) the BSD (or whatever) one is more portable in practice.

DigitalRoss
On FreeBSD, man statfs gives me "HISTORY The statfs() system call first appeared in 4.4BSD."
Kinopiko
Thanks, got it.
DigitalRoss
+1  A: 

statfs() is deprecated in favor of statvfs(), which deals considerably better with large file support. statfs() is known to do odd things for sizes that exceed the value of an unsigned long.

As far as I can tell (and remember), statvfs() has been around since Redhat 7.3, just after being introduced as a POSIX replacement. You'll likely find it on (most) modern systems.

Tim Post
Do you mean depreciated or deprecated?
Artelius
Thanks, edited. Not enough coffee
Tim Post