Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Jul 2016 17:04:24 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Don Lewis <truckman@FreeBSD.org>
Cc:        mmacy@nextbsd.org, ache@freebsd.org, freebsd-hackers@freebsd.org, freebsd-current@freebsd.org, kmacy@freebsd.org
Subject:   Re: difference in SIGCHLD behavior between Linux and FreeBSD breaks apt
Message-ID:  <20160707140424.GM38613@kib.kiev.ua>
In-Reply-To: <201607070714.u677EqVx008159@gw.catspoiler.org>
References:  <155c427b1ea.e316552376378.990303254341485453@nextbsd.org> <201607070714.u677EqVx008159@gw.catspoiler.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jul 07, 2016 at 12:14:52AM -0700, Don Lewis wrote:
> On  6 Jul, Matthew Macy wrote:
> > 
> > 
> > 
> >  ---- On Wed, 06 Jul 2016 23:48:53 -0700 Andrey Chernov
> >  <ache@freebsd.org> wrote ----
> >  > On 07.07.2016 9:40, Matthew Macy wrote: 
> >  > >  
> >  > >  
> >  > >  
> >  > >  ---- On Wed, 06 Jul 2016 23:28:40 -0700 Andrey Chernov
> >  > >  <ache@freebsd.org> wrote ----
> >  > >  > On 07.07.2016 7:52, K. Macy wrote:  
> >  > >  > > On Wednesday, July 6, 2016, Don Lewis <truckman@freebsd.org>
> >  > >  > > wrote:
> >  > >  > >   
> >  > >  > >> On  6 Jul, Matthew Macy wrote:  
> >  > >  > >>> As a first step towards managing linux user space in a
> >  > >  > >>> chrooted
> >  > >  > >>> /compat/linux, initially for i915 testing with intel gpu
> >  > >  > >>> tools, later on to get widevine and steam to work I'm
> >  > >  > >>> trying to get apt to work. I've fixed a number of issues
> >  > >  > >>> to date in pseudofs/linprocfs but now I'm running in to
> >  > >  > >>> a bug caused by differences in SIGCHLD handling between
> >  > >  > >>> Linux and FreeBSD. The situation is that apt will spawn
> >  > >  > >>> dpkg and wait on a pipe read. On Linux when dpkg exits
> >  > >  > >>> the  SIGCHLD to apt causes a short read on the pipe
> >  > >  > >>> which lets apt then continue. On FreeBSD a SIGCHLD is
> >  > >  > >>> silently ignored. I've even experimented with doing a
> >  > >  > >>> kill -20 <apt pid> to no effect.
> >  > >  > >>>  
> >  > >  > >>> It would be easy enough to check sysvec against linux in
> >  > >  > >>> pipe_read and break out of the loop when it's awakened
> >  > >  > >>> from msleep (assuming there aren't deeper issues with
> >  > >  > >>> signal propagation for anything other than 
> >  > >  > >>> SIGINT/SIGKILL) and then do a short read. However, I'm
> >  > >  > >>> assuming that anyone who has worked in this area
> >  > >  > >>> probably has a cleaner solution.
> >  > >  > >>  
> >  > >  > >> It shoulds like SA_RESTART is set in sa_flags for SIGCHLD
> >  > >  > >> but shouldn't be in this case.
> >  > >  > >   
> >  > >  > >   
> >  > >  > >   
> >  > >  > > Good point.  
> >  > >  > >   
> >  > >  > > Thinking more about it, this seems like a bug in FreeBSD.
> >  > >  > > Not a valid behavioral difference.
> >  > >  >   
> >  > >  > You better need consult with POSIX before fixing things toward
> >  > >  > any Linuxisms blindly in our native code. I don't have a
> >  > >  > time now to see, is it really a bug according to POSIX, but
> >  > >  > please read or just find all SIGCHLD there:
> >  > >  > http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html  
> >  > >  > it explain SIGCHLD actions in deep details.  
> >  > >  > And that one too:  
> >  > >  > http://pubs.opengroup.org/onlinepubs/009695399/functions/sigaction.html  
> >  > >  
> >  > >  
> >  > >  
> >  > > I was pretty clear in my initial email that I'm only interested
> >  > > in changing behavior for Linux programs.
> >  >  
> >  > Of course, but in case it is FreeBSD bug, it should be fixed in our 
> >  > native code first before making any changes in Linuxator. 
> >  >  
> >  > > And I was asking for help with that, not a link to SUSv3 or POSIX.  
> >  >  
> >  > In case I was not helpful, sorry for that. Before you try to change 
> >  > something in Linuxator you need to be sure that FreeBSD does it
> >  > right (or wrong, then fix FreeBSD native code first). I am just
> >  > insisting on proper steps of fixing it.
> >  >  
> > 
> > 
> > I'm sorry for snapping . I misunderstood your intent. Using a SIGCHLD
> > to deliberately interrupt a pipe read is such a weird idiom. I'll test
> > fork vs clone on Linux and see how OS X responds to a SIGCHLD during a
> > pipe read.
> 
> It really depends on how signal handling has been set up.  From my
> understanding of the FreeBSD man pages and the Open Group documents, the
> default handling for SIGCHLD is to just ignore it, in which case it
> shouldn't interrupt the pipe read.  If the process has set up a SIGCHLD
> signal handler, then what happens with the read should depend on whether
> or not SA_RESTART was passed to sigaction().  I would expect that Linux
> would be the same as FreeBSD and the Open Group specs.
> 
> How does apt set up its handling of SIGCHLD?

BSD traditional and allowed handling of the signals with SIG_IGN
disposition is to discard such signal at the time of generation. Then,
such signal cannot interrupt a syscall regardless of SA_RESTART.  For
the interruption to work, some signal handler must be installed.

AFAIR both SysV and Linux do not discard ignored signals, but process
them up to the delivery point.

Sure the test demonstrating the difference is required to actually
diagnose and make conclusions.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20160707140424.GM38613>