ptg10805159Section 3.6 lseekFunction 69
if (lseek(fd, 16384, SEEK_SET) == -1)
err_sys("lseek error");
/* offset now = 16384 */
if (write(fd, buf2, 10) != 10)
err_sys("buf2 write error");
/* offset now = 16394 */
exit(0);
}Figure 3.2 Create a file with a hole in itRunning this program gives us
$./a.out
$ls -l file.hole check its size
-rw-r--r-- 1 sar 16394 Nov 25 01:01 file.hole
$od -c file.hole let’slook at the actual contents
0000000 a bcdefghij\0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0040000 A BCDEFGHIJ
0040012We use theod( 1 )command to look at the contents of the file. The-cflag tells it to print
the contents as characters.We can see that the unwritten bytes in the middle areread
back as zero. The seven-digit number at the beginning of each line is the byte offset in
octal.
To prove that there is really a hole in the file, let’s comparethe file we just created
with a file of the same size, but without holes:
$ls -ls file.hole file.nohole comparesizes
8-rw-r--r-- 1 sar 16394 Nov 25 01:01 file.hole
20 -rw-r--r-- 1sar 16394 Nov 25 01:03 file.noholeAlthough both files arethe same size, the file without holes consumes 20 disk blocks,
whereas the file with holes consumes only 8 blocks.
In this example, we call thewritefunction (Section 3.8). We’ll have more to say
about files with holes in Section 4.12.Because the offset address that lseek uses is represented by an off_t,
implementations areallowed to support whatever size is appropriate on their particular
platform. Most platforms today provide two sets of interfaces to manipulate file offsets:
one set that uses 32-bit file offsets and another set that uses 64-bit file offsets.
The Single UNIX Specification provides a way for applications to determine which
environments aresupported through thesysconffunction (Section 2.5.4). Figure3.3
summarizes thesysconfconstants that aredefined.