Sponsored Content
Full Discussion: Why Cause EINTR ?
Top Forums Programming Why Cause EINTR ? Post 35186 by Perderabo on Tuesday 1st of April 2003 08:33:13 AM
Old 04-01-2003
If a read system call returns a -1 with errno set to EINTR, then it was interrupted by a signal. The default action of every signal is to either be completely ignored or to kill the process. Thus it had to be some signal that was caught.

When you installed your signal handler, I hope that you were using the new Posix sigaction() system call. One of the elements of the sigaction structure is sa_flags. Look at the docs for your OS to see what flags you can set. You probably have one called SA_RESTART. That flag will cause a system call to be restarted, so that if your signal handler returns, the read() will act as if the signal never happened. This is most likely what you want.

Posix does not require support of SA_RESTART, but most OS's do. (And if yours doesn't, I would be interested to learn that.) Without SA_RESTART, you will need to loop back to the read() and restart it yourself.

If you really want to ignore the signal, set sa_handler to SIG_IGN. (If you want to ignore the EINTR, just don't test for that! Smilie )

Be careful that you don't disable too many signals. The remote system could be dead, perhaps forever. The user should be able to abort the program without resorting to "kill -9".
 
BSD_SIGNAL(3)						   BSD Library Functions Manual 					     BSD_SIGNAL(3)

NAME
bsd_signal -- simplified signal facilities SYNOPSIS
#include <signal.h> void (* bsd_signal(int sig, void (*func)(int)))(int); or in an equivalent but easier to read typedef'd version: typedef void (*sig_t) (int); sig_t bsd_signal(int sig, sig_t func); DESCRIPTION
The bsd_signal() function provides a partially compatible interface for programs written to historical system interfaces (see USAGE below). The function call bsd_signal(sig, func) has the effect as if implemented as: void (*bsd_signal(int sig, void (*func)(int)))(int) { struct sigaction act, oact; act.sa_handler = func; act.sa_flags = SA_RESTART; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, sig); if (sigaction(sig, &act, &oact) == -1) return(SIG_ERR); return(oact.sa_handler); } The handler function should be declared: void func(int sig) where sig is the signal number. The behavior is undefined if func() is a function that takes more than one argument, or an argument of a different type. RETURN VALUES
Upon successful completion, bsd_signal() returns the previous action for sig. Otherwise, SIG_ERR is returned and errno is set to indicate the error. ERRORS
Refer to sigaction(2). USAGE
This function is a direct replacement for the BSD signal(3) function for simple applications that are installing a single-argument signal handler function. If a BSD signal handler function is being installed that expects more than one argument, the application has to be modi- fied to use sigaction(2). The bsd_signal() function differs from signal(3) in that the SA_RESTART flag is set and the SA_RESETHAND will be clear when bsd_signal() is used. The state of these flags is not specified for signal(3). SEE ALSO
sigaction(2), sigaddset(3), sigemptyset(3), signal(3) STANDARDS
The bsd_signal() function conforms to IEEE Std 1003.1-2001 (``POSIX.1''). BSD
December 20, 2003 BSD
All times are GMT -4. The time now is 06:17 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy