Re: Open files not shared with the child process ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

By reading all these mails on fork( clone ) its very
difficult for me ( and i think all the students those
r very new to linux kernel and os development ) to
learn what is actually happening after fork, i.e open
files are shared r not. so can any body plz explain it
clearlly.

Thanks in advance

Deepak Joshi. 


--- Jan Hudec <bulb@xxxxxx> wrote:

> On Sun, Dec 25, 2005 at 16:12:13 +0200, MHD.Tayseer
> Alquoatli wrote:
> > > There are two things. The file handle used in
> userspace, which is an
> > > integeral index into a file descriptor table,
> and the file descriptor
> > > itself,
> > > which is struct file. The struct file is
> *always* shared after both clone
> > > and
> > > fork. The CLONE_FILES flag specifies whether the
> file descriptor *table*
> > > will be shared, or not.
> > 
> > we are talking about the opened file table that is
> in the task descriptor
> 
> Sure we are. But the original poster was not at all
> clear what he was talking
> about.
> 
> > 
> > > > well .. when you call fork, the process
> descriptor of the calling
> > > > process
> > > > will be duplicated, then the new copy will be
> given to the child process
> > > > control.
> > > > you can see that if a process has already
> opened 4 files there will be 7
> > > > files in the process file table (stdin,
> stdout, stderr, 4files then the
> > > > new
> > > > duplicated copy generated by fork will have
> the same entries in it's
> > > > file
> > > > table .. but from this moment and on .. each
> process (the parent and the
> > > > child) will work on it's own copy .. and after
> this point, if the parent
> > > > process opened a file nothing will be affected
> in the child process
> > > > descriptor, and vice verse
> > >
> > > This is not true, actually. They do share the
> struct file and since that
> > > is
> > > where the current position lives, the current
> position WILL be affected.
> > > That's why if parent and child both have a log
> file open (from before
> > > fork)
> > > and write to it, output from BOTH will be there,
> mixed together.
> > 
> > this is right .. the struct file (which is part of
> the VFS structs for every
> > file system) will be shared .. but this is only 
> -as i've pointed out- when
> > the file has been opened before calling fork .. i
> think i was clear that
> > what i meant is the file descriptor table which
> will be duplicated .. after
> > calling fork you cannot open a file from the
> parent task, then pass the new
> > file descriptor index to the child task some how
> and then let the child task
> > calls "read" from that file descriptor index cause
> it's not associated with
> > the new task's files descriptor table
> 
> Sure. But you started with 'the process descriptor
> will be duplicated', which
> is not very clear. The 'process descriptor' is
> struct task_struct. Well, that
> will always be duplicated. The important point is
> that clone duplicates the
> *table* of file descriptors, not the file
> descriptors (struct file)
> themselves as the original poster seemed to think.
> 
> > > > here you can find the difference between clone
> and fork .. when a process
> > > > clones a thread using clone then the new
> process descriptor (actually
> > > > it's
> > > > called "task" in Linux) will point it's
> resources like the file table to
> > > > the
> > > > parent process .. it won't copy it, it'll
> point to it instead .. and
> > > > this is
> > > > the reason why the process and the cloned task
> will still be able to
> > > > share
> > > > opened files (and any other cloned resource)
> till the end
> > >
> > > No. fork, though being a different syscall, is a
> strict subset of clone.
> > > sys_clone (_syscall2(int, clone, int, flags,
> void *, child_stack)) with
> > > flags
> > > of 0 and child stack of NULL does exactly fork.
> > >
> > > Note, that it is flags 0, *NOT* CLONE_SIGHAND.
> Again CLONE_SIGHAND does
> > > not
> > > mean the installed handlers remain the same --
> the *always* do -- but that
> > >
> > > the descriptor table is shared -- which after
> fork it is *NOT*.
> > 
> > 
> > when you ask "clone" not to clone anything it'll
> do as fork does (i.e. will
> > duplicate the task descriptor) but if you ask
> "clone" to clone resources A
> > and B for example it'll duplicate the task
> descriptor and then let resource
> > A and B from the child task point to resource A
> and B from the parent task
> > without allocating anything for them
> 
> -- 
> 						 Jan 'Bulb' Hudec <bulb@xxxxxx>
> 


		
___________________________________________________________ 
Yahoo! Photos ? NEW, now offering a quality print service from just 8p a photo http://uk.photos.yahoo.com

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux