26

Let's say I open a file with open(). Then I fork() my program.

Will father and child now share the same offset for the file descriptor?

I mean if I do a write in my father, the offset will be changed in child too?

Or will the offsets be independent after the fork()?

Delimitry
  • 2,987
  • 4
  • 30
  • 39

2 Answers2

32

From fork(2):

  *  The child inherits copies of the parent’s set of open file  descrip-
     tors.   Each  file  descriptor  in the child refers to the same open
     file description (see open(2)) as the corresponding file  descriptor
     in  the parent.  This means that the two descriptors share open file
     status flags, current file offset, and signal-driven I/O  attributes
     (see the description of F_SETOWN and F_SETSIG in fcntl(2)).
Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358
  • 1
    Doesn't this depend where the file has been opened? Meaning if the open(filename, int..) call is made after the fork, or before it. – ArmenB Dec 13 '12 at 18:48
  • The odd thing about this is, if the file open statement is made after the fork, then you have two different file descriptors. But when I try to lock the file using fcntl, it won't work. Both the child and the parent ignore the lock – ArmenB Dec 14 '12 at 17:29
  • 3
    That... sounds like a kernel bug. – Ignacio Vazquez-Abrams Dec 14 '12 at 17:30
  • 1
    Is going to also happend with file descriptor 1, that is suppose to be the STDOUT? Is my forked process going to share the stdout? – Guillermo Aug 21 '13 at 10:22
  • @IgnacioVazquez-Abrams will it be shared between children of the parent? if one child opens a file, will the other children share the same copy? – Dejell Dec 04 '17 at 17:35
  • @IgnacioVazquez-Abrams does that mean that they will all share the same file even if one child process opened it? – Dejell Dec 04 '17 at 18:12
  • 1
    @Dejell: `fork()` causes children to inherit certain of their parent's structures. If there is no parent/child relationship, then... – Ignacio Vazquez-Abrams Dec 04 '17 at 18:13
  • @Dejell I had the same confusion, but as I understand this answer, only the files that are already open in the parent at the time of the fork call will be open in the child. So no future opening of files by either the parent or the child will be shared. – JakeD Dec 10 '18 at 19:31
5

They do share the same offset.

Martin v. Löwis
  • 124,830
  • 17
  • 198
  • 235