On Fri, Aug 06, 2010 at 11:35:36AM -0700, Richard L. Hamilton wrote:
> > On Fri, Aug 06, 2010 at 01:05:38PM -0400, James
> > Carlson wrote:
> > > Richard L. Hamilton wrote:
> > > >James Carlson wrote:
> > > >> For what it's worth, I would use
> > > >> fork()/setsid()/fork() to disclaim a
> > > >> controlling tty.  It's simple and always works.
> > > >>  (Though, notably, it
> > > >> oes not get you outside of an existing contract,
> > > >> which is sometimes an
> > > >> important distinction for programs that operate
> > as
> > > >> daemons.)
> > > >
> > > > That's exactly what I wanted to avoid, using a
> > sort of
> > > > semi-daemonizer program that would leave
> > backgrounding
> > > > up to the invoker, so that if the invoker wished,
> > it could
> > > > collect status to discover any failures.  That's
> > a little
> > > > tricky to do with fork()/setsid()/fork(), taking
> > into account
> > > > the possibility of non-zero return codes or
> > signals (with or without
> > > > core dumps).
> > >
> > > That's what Solaris contracts are (at least partly)
> > about.  They allow
> > > you to monitor children that may go through
> > multiple forks.
> > >
> > > I can't say I'd recommend TIOCNOTTY for any new
> > code intended to run on
> > > Solaris.  But good luck.  ;-}
> > >
> >
> > i implemented TIOCNOTTY support as part of the
> > original brandz project.
> > we needed it for the lx brand, since
> > fork()/setsid()/fork() wasn't
> > really an option for emulating TIOCNOTTY.  since then
> > the lx brand has
> > been retired, but we've kept TIOCNOTTY for
> > compatibility.  it's a public
> > interface documented in termio.7i (on nevada at
> > least).  i don't think
> > there's any reason for us to remove it, so i don't
> > really think there's
> > any reason to recommend not using it.
> >
> > that said, there is one restriction on the caller of
> > the interface.
> > specifically, the process calling it must be a
> > session group leader.
> > here's the man page blurb from nevada:
> >
> > ---8<---
> > TIOCNOTTY       Takes no argument. Release  the
> >  controlling
> > terminal   associated   with
> >   the   current
> > processes session group.  The
> >   calling  pro-
> > cess  must  be  the  session group
> > leader to
> >                      issue this ioctl.
>
>
> Hmm...I just compiled a couple of test programs (although not
> compliant with that restriction you just mentioned, which
> incidentally does _not_ apply to other implementations
> (where TIOCNOTTY by a tty group leader process generates
> a SIGHUP for all processes in the group and disassociates them
> all from their controlling terminal, while any other process
> doing it only disassociates itself; the latter case being at
> least as useful as the former, I would think).
>

if a session group leader issues a TIOCNOTTY, all processes in the
session group will get SIGHUP.  see freectty_signal().

in the case of a non-session leader issuing TIOCNOTTY, that will fail.
the reason is that cttys on solaris are bound to sessions and not
processes.  so you can't disassociate a ctty for a single process on
solaris, you can only do it for all the processes in a session.

> On snv_97, one (opening /dev/tty and applying the ioctl there)
> resulted in the ioctl failing with EINVAL (gentty.c rejecting it,
> I presume).  The other applied it to stdin, which was a terminal.
> That "succeeded" (didn't return -1), but ps showed the process
> still associated with its controlling terminal.
>

perhaps there's a bug with ps or proc reporting?  i'm not sure why your
seeing that.

> I'll repeat that test on snv_134 (latest publically available) as
> soon as I get a compiler installed (my snv_134 is x86 under
> VirtualBox (on a Mac Mini), whereas my snv_97 is SPARC on bare metal;
> hopefully I can get the compiler installed, given limited
> resources available for the VM).
>
> If the same results hold, I'd say that at most, TIOCNOTTY
> works when used, probably not as it "should" be on a file descriptor
> opened via /dev/tty, but rather on any _other_ terminal file
> descriptor, and then only if your restriction (must be session group
> leader) is met.
>
> If that's the case, it might as well be dead code, because there's
> no situation I can think of compatible with other implementations
> where it does anything at all...which would be unfortunate, because
> where it's traditionally supported, it's far and away the easiest way
> to do what it does, with the least side-effects, meaning that
> code originating on such a system will probably use it unless the
> author went out of their way to be standards-compliant.
>

well, the behavior we implemented seemed to be sufficient for running
linux apps at the time.  i don't remember specifically what apps used
this functionality, but i'd guess things like shells and expect.

> I'll report the results of my snv_134 test if I can get the compiler
> installed...

well, it sounds like you want to allow a single process to
dissassociate.  that isn't possible.  in that case the process i would
think the process that wants to disassociate should either:

- create it's own session group

- just close it's tty (in which case as long as it's not in the
  foreground of the session group, it will never get any signals if/when
  the ctty is closed.

if that doesn't work for you then i recommend following james
suggestion.

ed
_______________________________________________
opensolaris-code mailing list
opensolaris-code@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to