Truncating and Removing Files

Removing files is something that people just take for granted in the same vein as pulling up an editor and creating a new file. However, the internal operation of truncating and removing files can be a particularly complicated operation as later chapters will show.

There are two calls that can be invoked to truncate a file:

#include <unistd.h>

int truncate(const char *path, off_t length);
int ftruncate(int fildes, off_t length);

The confusing aspect of truncation is that through the calls shown here it is possible to truncate upwards, thus increasing the size of the file! If the value of length is less than the current size of the file, the file size will be changed and storage above the new size can be freed. However, if the value of length is greater than the current size, storage will be allocated to the file, and the file size will be modified to reflect the new storage.

To remove a file, the unlink() system call can be invoked:

#include <unistd.h>

int unlink(const char *path);

The call is appropriately named since it does not necessarily remove the file but decrements the file's link count. If the link count reaches zero, the file is indeed removed as the following example shows:

$ touch myfile
$ ls -l myfile
-rw-r--r-       1 spate     fcf                  0 Mar 15 11:09 myfile
$ ln myfile myfile2
$ ls -l myfile*
-rw-r--r-       2 spate     fcf                  0 Mar 15 11:09 myfile
-rw-r--r-       2 spate     fcf                  0 Mar 15 11:09 myfile2
$ rm myfile
$ ls -l myfile* -rw-r--r- 1 spate fcf 0 Mar 15 11:09 ...

Get UNIX Filesystems: Evolution, Design, and Implementation now with the O’Reilly learning platform.

O’Reilly members experience live online training, plus books, videos, and digital content from nearly 200 publishers.