Discussion:
System calls getting interrupted with signals, even with SA_RESTART
Robby Dermody
2003-12-13 19:55:52 UTC
Permalink
Hey guys,

I've ran into a little problem. I have been porting an piece of software to
Cygwin. It builds and initially runs fine, but when I get a SIGALRM signal,
which I use for asynchronous timers, a few things return with an EINTR:

-select()
-IPC semaphores (using CygIPC)

Note that I am asserting SA_RESTART when I set up the signal handler. The
procedure I take is this:
-----------------
struct sigaction SigAction;
memset(&SigAction, 0, sizeof(struct sigaction));
SigAction.sa_handler = Internal_Act_HandleTimers;
SigAction.sa_flags = SA_RESTART; //restart system calls interrupted with
this signal

if(sigaction(SIGALRM, &SigAction, NULL) < 0)
{
leprintf(LOGGING_SELF, LVL_SYSERR, "Error initing SIGALRM handler");
return false;
}
siginterrupt(SIGALRM, false);
----------------

The error returned from select is: (errno, strerror(errno)
errno - 4 (Interrupted system call)
(obviously ENTR)

Obviously the signal handler is set up correctly, and when just asserting
SA_RESTART didn't work, I tried sticking a call to siginterrupt in there as
well, but had no luck there either.

Is it just a stupid mistake on my end, or something I'm failing to see? The
only other thing that might be the case is that the restarting of select and
the semaphore stuff isn't implemented?

TIA for ANY help!!

Robby
---
Robby Dermody (***@p9i.com)
phase9 industries, inc. - http://www.p9i.com/

We confide in our strength, without boasting of it; we respect that of
others, without fearing it.
-Thomas Jefferson
Christopher Faylor
2003-12-13 20:03:06 UTC
Permalink
Post by Robby Dermody
Hey guys,
I've ran into a little problem. I have been porting an piece of software to
Cygwin. It builds and initially runs fine, but when I get a SIGALRM signal,
-select()
From the SUSv3 documentation on select():

If SA_RESTART has been set for the interrupting signal, it is
implementation-defined whether the function restarts or returns with
[EINTR].

select() does not currently honor SA_RESTART on cygwin.
Robby Dermody
2003-12-13 20:12:23 UTC
Permalink
As a reply to my own thread, after some more googling, it seems that
select() ignores SA_RESTART (maybe only when it has a timeout value defined,
and does not just block indefinately)....

http://www.ussg.iu.edu/hypermail/linux/kernel/0003.2/0336.html

Makes sense why.

Also with the semaphore stuff, it seems that's the case as well:
"semop is never automatically restarted after being interĀ­
rupted by a signal handler, regardless of the setting of
the SA_RESTART flags when establishing a signal handler."

Wierd that I recall both of them working under Linux, which reaffirmed my
previous notions

Move along, nothing to see here. :)

Robby
----- Original Message -----
From: "Robby Dermody" <***@p9i.com>
To: <***@cygwin.com>
Sent: Saturday, December 13, 2003 2:55 PM
Subject: System calls getting interrupted with signals, even with SA_RESTART
Post by Robby Dermody
Hey guys,
I've ran into a little problem. I have been porting an piece of software to
Cygwin. It builds and initially runs fine, but when I get a SIGALRM signal,
-select()
-IPC semaphores (using CygIPC)
Note that I am asserting SA_RESTART when I set up the signal handler. The
-----------------
struct sigaction SigAction;
memset(&SigAction, 0, sizeof(struct sigaction));
SigAction.sa_handler = Internal_Act_HandleTimers;
SigAction.sa_flags = SA_RESTART; //restart system calls interrupted with
this signal
if(sigaction(SIGALRM, &SigAction, NULL) < 0)
{
leprintf(LOGGING_SELF, LVL_SYSERR, "Error initing SIGALRM handler");
return false;
}
siginterrupt(SIGALRM, false);
----------------
The error returned from select is: (errno, strerror(errno)
errno - 4 (Interrupted system call)
(obviously ENTR)
Obviously the signal handler is set up correctly, and when just asserting
SA_RESTART didn't work, I tried sticking a call to siginterrupt in there as
well, but had no luck there either.
Is it just a stupid mistake on my end, or something I'm failing to see? The
only other thing that might be the case is that the restarting of select and
the semaphore stuff isn't implemented?
TIA for ANY help!!
Robby
---
phase9 industries, inc. - http://www.p9i.com/
We confide in our strength, without boasting of it; we respect that of
others, without fearing it.
-Thomas Jefferson
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
Loading...