On Wed, Aug 24, 2011 at 10:19:07PM +0400, Slawa Olhovchenkov wrote: > System is 8.2-RELEASE (GENERIC), amd64. > Application -- i386 for freebsd7. > > In ktrace dump I find some strange result: > > 22951 100556 kas-milter CALL sigwait(0xffdfdf80,0xffdfdf7c) > 22951 100556 kas-milter RET sigwait 4 > 22951 100556 kas-milter PSIG SIGUSR2 caught handler=0x804c0f0 mask=0x4003 > code=0x0 > > RET sigwait 4 confused me, and, I think, confused application too. > > man sigwait: > > ERRORS > The sigwait() system call will fail if: > > [EINVAL] The set argument specifies one or more invalid signal > numbers. > > [EFAULT] Any arguments point outside the allocated address > space or there is a memory protection fault. > > > How sigwait can return '4'? > May be EINTR, converted from ERESTART? But kern_sigtimedwait from sigwait > must > be called with timeout == NULL... >
What should the system do for a delivered signal not present in the set ? I guess this is the case of your ktrace. Looking at the SUSv4, I see no mention of the situation, but in Oracle SunOS 5.10 man page for sigwait(2), it is said explicitely EINTR The wait was interrupted by an unblocked, caught signal. So I think that we have a bug in the man page. diff --git a/lib/libc/sys/sigwait.2 b/lib/libc/sys/sigwait.2 index 8c00cf4..b462201 100644 --- a/lib/libc/sys/sigwait.2 +++ b/lib/libc/sys/sigwait.2 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 11, 2005 +.Dd August 24, 2011 .Dt SIGWAIT 2 .Os .Sh NAME @@ -94,6 +94,8 @@ The .Fn sigwait system call will fail if: .Bl -tag -width Er +.It Bq Er EINTR +The system call was interrupted by an unblocked, caught signal. .It Bq Er EINVAL The .Fa set
pgpWlJF1UhSzz.pgp
Description: PGP signature