Re: [PATCH 0/6] CLONE_FD: Task exit notification via file descriptor

From: Thiago Macieira
Date: Sat Mar 14 2015 - 15:03:24 EST


On Friday 13 March 2015 18:11:32 Thiago Macieira wrote:
> On Friday 13 March 2015 14:51:47 Andy Lutomirski wrote:
> > In any event, we should find out what FreeBSD does in response to
> > read(2) on the fd.
>
> I've just successfully installed FreeBSD and compiled qtbase (main package
> of Qt 5) on it.
>
> I'll test pdfork during the weekend and report its behaviour.

Here are my findings about pdfork.

Source: http://fxr.watson.org/fxr/source/kern/sys_procdesc.c?v=FREEBSD10
Qt adaptations: https://codereview.qt-project.org/108561

Processes created with pdfork() are normal processes that still send SIGCHLD
to their parents. The only difference is that you get the extra file descriptor
that can be passed to the pdgetpid() system call and works on select()/poll().
Trying to read from that file descriptor will result in EOPNOTSUPP.

Since they've never implemented pdwait4() (it's not even declared in the
headers), the only way to reap a child if you only have the file descriptor is
to first pdgetpid() and then call wait4() or wait6().

If you don't pass PD_DAEMON, the child process gets killed with SIGKILL when
the file closes.

Conclusion:
Pros: this is the bare minimum that we'd need to disentangle the SIGCHLD mess.
As long as all child process activations use this feature, the problem is
solved.

Cons: it requires cooperation from all child starters. If some other library
or the application installs a global SIGCHLD handler that waits on all child
processes, like libvlc used to do and Glib and Ecore still do, you won't be
able to get the child exit status.

I have not tested what happens if you try to pass the file descriptor to other
processes (can you even do that on FreeBSD?). But even if you could and got
notifications, you couldn't wait on the child to get its exit status -- unless
they implement pdwait4.

- pdfork: can be emulated with clone4 + CLONE_FD (+ CLONEFD_KILL_ON_CLOSE)
- pdwait4: can be emulated with read()
- pdgetpid: needs an ioctl
- pdkill: needs an ioctl [or just write()]

--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/