From: Paolo Ornati <ornati@fastwebnet.it>
To: "Theodore Ts'o" <tytso@mit.edu>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: Lack of Documentation about SA_RESTART...
Date: Tue, 12 Jul 2005 10:38:11 +0200 [thread overview]
Message-ID: <20050712103811.0087a7e3@localhost> (raw)
In-Reply-To: <20050711143427.GC14529@thunk.org>
On Mon, 11 Jul 2005 10:34:27 -0400
Theodore Ts'o <tytso@mit.edu> wrote:
> According to the Single Unix Specification V3, all functions that
> return EINTR are supposed to restart if a process receives a signal
> where signal handler has been installed with the SA_RESTART flag.
Thanks to have cited SUS... I'm reading it and is much cleaner than
manpages :-)
"SA_RESTART
This flag affects the behavior of interruptible
functions; that is, those specified to fail with errno set to [EINTR].
If set, and a function specified as interruptible is interrupted by this
signal, the function shall restart and shall not fail with [EINTR]
unless otherwise specified. If the flag is not set, interruptible
functions interrupted by this signal shall fail with errno set to
[EINTR]"
Note the "unless otherwise specified".
>
> > Example of behavior: according to source code it seems that
> > "connect()" (the "net/ipv4/af_inet.c : inet_stream_connect()"
> > implementation) returns -ERESTARTSYS if interrupted, but if the
> > socket is in non-blocking mode it returns -EINTR.
>
> If the socket is non-blocking mode, and there isn't a connection ready
> to be received, then the socket is going to return with some kind of
> errno set; either EINPROGRESS (Operation now in progress) or EALREADY
> (Operation already in progress), or if a signal came in during the
> system call (which would happen pretty rarely, the window for the race
> condition is pretty small) it will return EINTR. I _think_ that a
> close reading of the specification would state that the system call
> should be restarted, and since a connection isn't ready, then at that
> point EINPROGRESS or EALREADY would be returned.
>
Reading SUSV3 it seems that doing a connection with non-blocking socket
CANNOT return EINTR... and this make sense.
The particular case you analized (blocking connect interrupted by a
SA_RESTART signal) is interesting... and since SUSV3 says
"but the connection request shall not be aborted, and the connection
shall be established asynchronously" (with select() or poll()...)
both for EINPROGRESS and EINTR, I think it's quite stupit to
automatically restart it and then return EALREADY.
The logically correct behaviur with blocking connect interrupted and
then restarted should be to continue the blocking wait... IHMO.
--
Paolo Ornati
Linux 2.6.12.2 on x86_64
next prev parent reply other threads:[~2005-07-12 8:42 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-11 10:32 Lack of Documentation about SA_RESTART Paolo Ornati
2005-07-11 14:34 ` Theodore Ts'o
2005-07-12 3:30 ` Philippe Troin
2005-07-12 8:43 ` Paolo Ornati
2005-07-12 8:38 ` Paolo Ornati [this message]
2005-07-12 10:10 ` Paolo Ornati
2005-07-12 12:04 ` Theodore Ts'o
2005-07-12 15:25 ` Paolo Ornati
2005-07-12 18:16 ` Theodore Ts'o
2005-07-13 7:45 ` Paolo Ornati
2005-07-24 0:30 ` Linus Torvalds
2005-07-24 7:28 ` Paolo Ornati
2005-07-24 14:56 ` Theodore Ts'o
2005-07-25 8:02 ` Paolo Ornati
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050712103811.0087a7e3@localhost \
--to=ornati@fastwebnet.it \
--cc=linux-kernel@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox