From owner-freebsd-threads@FreeBSD.ORG Tue Mar 1 15:23:15 2005 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 96EA516A4CE for ; Tue, 1 Mar 2005 15:23:15 +0000 (GMT) Received: from mail.mynet.cz (74.mynet.cz [217.11.249.74]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1D67643D2D for ; Tue, 1 Mar 2005 15:23:14 +0000 (GMT) (envelope-from jp@devnull.cz) Received: from axxem.hide.subzone.cz (subzone.osad.prg.mynet.cz [82.119.254.162]) by mail.mynet.cz (8.12.11/8.12.11) with ESMTP id j21FNH29008374 (version=TLSv1/SSLv3 cipher=DHE-DSS-AES256-SHA bits=256 verify=NO) for ; Tue, 1 Mar 2005 16:23:19 +0100 (CET) (envelope-from jp@devnull.cz) Date: Tue, 1 Mar 2005 16:23:04 +0100 (CET) From: Jan Pechanec X-X-Sender: jp@axxem.hide.subzone.cz To: freebsd-threads@freebsd.org Message-ID: <20050301155539.Q27541@axxem.hide.subzone.cz> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Subject: 4.x: masking signals has no effect without signal handlers installed X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Mar 2005 15:23:15 -0000 hi all, I can see that masking signals under 4.10|11 has no effect unless I install respective signal handlers. Is it a bug, a feature or my mistake? The same program compiled under 5.3, tried with all three threads libraries, works as I would expect - masking has effect even without handlers. in this example run under 4.10|11, ^C terminates the program, compiled with: gcc -pthread -o pthread_sigmask pthread_sigmask.c if signal() call is commented out, ^C has no effect. How can I block all signals for particular thread without creating all sighandlers? Unfortunately using 5.3 is not possible for me now. regards, j. #include #include #include #include #define FOR_EVER (24*3600) void sig_int_handler(int sig) { printf("SIGINT catched\n"); } int main(void) { sigset_t set; /* if (signal(SIGINT, sig_int_handler) == SIG_ERR) { perror("signal"); exit(1); } */ sigfillset(&set); if (pthread_sigmask(SIG_SETMASK, &set, NULL) != 0) { printf("pthread_sigmask() error\n"); exit(1); } // for ( ; ; ) ; sleep(FOR_EVER); printf("alive again\n"); return 0; } -- Jan Pechanec