Channels that come from a single opening share the same file position;
we call them linked channels. Linked channels result when you
make a stream from a descriptor using fdopen, when you get a
descriptor from a stream with fileno, when you copy a descriptor
with dup or dup2, and when descriptors are inherited
during fork. For files that don’t support random access, such as
terminals and pipes, all channels are effectively linked. On
random-access files, all append-type output streams are effectively
linked to each other.
If you have been using a stream for I/O (or have just opened the stream), and you want to do I/O using another channel (either a stream or a descriptor) that is linked to it, you must first clean up the stream that you have been using. See Cleaning Streams.
Terminating a process, or executing a new program in the process, destroys all the streams in the process. If descriptors linked to these streams persist in other processes, their file positions become undefined as a result. To prevent this, you must clean up the streams before destroying them.
In addition to cleaning up a stream before doing I/O using another
linked channel, additional precautions are needed to ensure a
well-defined file position indicator in some cases. If both the
following conditions hold, you must set the file position indicator on
the new channel (a stream) using a function such as fseek.
fseek.
POSIX requires such precautions in more cases: if either the old or
the new linked channel is a stream (whether or not previously active)
and the file position indicator was previously set on any channel
linked to those channels with a function such as fseek or
lseek.