From owner-freebsd-hackers@FreeBSD.ORG Thu Jan 8 05:48:36 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5D0F016A4CE for ; Thu, 8 Jan 2004 05:48:36 -0800 (PST) Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3793943D5F for ; Thu, 8 Jan 2004 05:48:35 -0800 (PST) (envelope-from eischen@vigrid.com) Received: from mail.pcnet.com (mail.pcnet.com [204.213.232.4]) by mail.pcnet.com (8.12.10/8.12.1) with ESMTP id i08DmYiw015598; Thu, 8 Jan 2004 08:48:34 -0500 (EST) Date: Thu, 8 Jan 2004 08:48:34 -0500 (EST) From: Daniel Eischen X-Sender: eischen@pcnet5.pcnet.com To: rmkml In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: freebsd-hackers@freebsd.org Subject: Re: problem with signal handling and threads (fbsd49R) X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 08 Jan 2004 13:48:36 -0000 On Thu, 8 Jan 2004, rmkml wrote: > Hi, > > I've got a problem with signal handling and threads. > I've reproduced the problem in a simple code. > Description of program: > install a signal handler SIGINT. > create a thread that do nothing except waiting. > main thread use poll to wait forever [ poll(,,-1) ]. > user has too crtl-C to interrupt poll > after 5 ctrl-C, loop is over and main-thread signals sub-thread to > stops. > > In fact, it appears not to work correctly: after one ctrl-C, user has to > press ctrl-C twice before poll returns with errno=EINTR !! > If the thread creation is removed from code, the expected behavior is > seen : the program works fine. > > If I replace the poll by sigsuspend() the program works fine too. > > Is there something wrong with poll function ? No, it's your program. Why do you think the signal will only be delivered to the main thread and not the other (run) thread? If you want a particular thread to receive a signal, then you had better set up signal masks for all threads appropriately (or use sigwait()).