When a file is opened, a file pointer is created to indicate which specific location (or byte) in the file is going to be read or written next. If a file descriptor is duplicated, either with the dup or dup2 commands or if a process is forked and the new process has a file descriptor duplicative of the one in the parent process (as happens in the dualfile program), both file descriptors share the file pointer, if I read or write from one file descriptor, the other descriptor's pointer is also advanced (or otherwise modified). Every file system/OS I have ever worked with Allows random access to files, you can jump directly to any location. Allows you to lengthen a file by appending to the end of it. Allows you to shorten a file by removing the end of it with some variation of a truncate command. Allows you to overwrite existing characters with other characters. NO file system/OS I have ever worked with Allows you to insert characters before existing characters in the file: like inserting C before AT to give you CAT in the file. Allows you to remove characters from between other characters. Like removing IRETR from FIRETRUCK . They all allow you to add characters to the end and to remove characters from the end and to overwrite existing characters anywhere in the file. Every file system I have ever used stores files in bytes. (0 - 255). Every file system I have ever seen has a maximum file size. Your file pointer has to be able to store where (what byte) you are about to read or write. And so there is a spot in memory for that numeric location, and that location can't exceed the space allotted to it, so there is a maximum location position, which means a maximum file size. This is not true for sequential files like pipes, sockets, or especially tape drives. Since you don't store a location address, there is no limit to how large these files can be. Different file systems have different features/restrictions/weird stuff, and so you have to be careful. On Mac and Windows, filenames are case insensitive. If you name a file "hello" and you open it as "hElLo", no problem! But on Linux, filenames are case sensitive. On Linux, if you have one file called "dog" and another called "DOG", no problem. But if you FTP them over to a Windows or Mac, one of those files isn't going to transfer unless you have a system set up to change the name.