From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25826 invoked from network); 26 Oct 2002 03:22:27 -0000 Received: from sunsite.dk (130.225.247.90) by ns1.primenet.com.au with SMTP; 26 Oct 2002 03:22:27 -0000 Received: (qmail 20607 invoked by alias); 26 Oct 2002 03:22:21 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 17861 Received: (qmail 20569 invoked from network); 26 Oct 2002 03:22:20 -0000 To: zsh-workers@sunsite.dk Subject: Inconsistent signal handling? From: Philippe Troin Date: 25 Oct 2002 20:22:16 -0700 Message-ID: <877kg5c2af.fsf@ceramic.fifi.org> User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Sender: Philippe Troin --=-=-= In init.c, init_signals() says: void init_signals(void) { sigchld_mask = signal_mask(SIGCHLD); intr(); #ifndef QDEBUG signal_ignore(SIGQUIT); #endif install_handler(SIGHUP); install_handler(SIGCHLD); #ifdef SIGWINCH install_handler(SIGWINCH); #endif if (interact) { install_handler(SIGALRM); [1] signal_ignore(SIGTERM); } if (jobbing) { [2] long ttypgrp; [2] [2] while ((ttypgrp = gettygrp()) != -1 && ttypgrp != mypgrp) [2] kill(0, SIGTTIN); [2] if (ttypgrp == -1) { [2] opts[MONITOR] = 0; [2] } else { [2] signal_ignore(SIGTTOU); [2] signal_ignore(SIGTSTP); [2] signal_ignore(SIGTTIN); [2] attachtty(mypgrp); [2] } } [3] if (islogin) { [4] signal_setmask(signal_mask(0)); } else if (interact) { sigset_t set; sigemptyset(&set); sigaddset(&set, SIGINT); sigaddset(&set, SIGQUIT); signal_unblock(set); } } My remarks: [1] Why do we ignore SIGTERM on interactive sessions? That sounds like a bad idea to me. [2] See my previous mail <87bs5hc31h.fsf@ceramic.fifi.org> [3] Why do we only clean-up the signal mask on login shells? It should happen on interactive shells (there can be login non-interactive shells, eg. for X11 startup). [4] This is not enough to clean-up all inherited signal properties. If some signals have been ignored (with signal(SIG_IGN)) before zsh was exec()ed, then they are still ignored by zsh. exec*() only resets the disposition of signals which have a signal handler to SIG_DFL, but leaves SIG_IGNored signals as is (this is a POSIX requirement). I'd suggest changing init_signals to: void init_signals(void) { if (interact) { int i; signal_setmask(signal_mask(0)); for (i=0; i