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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url :
http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20110824/7cdf3225/attachment.pgp