help with signals (ultrix)

Simon Brown simon at its63b.ed.ac.uk
Mon Mar 7 05:49:43 AEST 1988


In article <1583 at boulder.Colorado.EDU> cdash at boulder.Colorado.EDU (Charles Shub) writes:
>on at&t unix if a system call to (eg) read is in progress when a signal
>occurs, the system call fails. On sun unix and ultrix, the system call
>restarts. On the sun, one can use siginterrupt(3) to make the system call
>fail. How do I make the system call fail under ultrix???????
>we are running 1.2 on microvaxen.

A particularly disgusting way to do this is to close(2) the descriptor being
read from inside the signal-handling routine, keeping a dup(2)'d copy so
you can restore it later. The read(2) cannot restart on a closed descriptor,
so it fails (with errno==EBADF). I'm sure there must be a better way (though
it probably isn't so portable :-)):

	extern int descriptor;
	static int dupdescriptor;

	handler()
	{
		dup2(descriptor, dupdescriptor);
		close(descriptor);
	}

	readchar()
	{
		char ch;
		switch (read(descriptor,&ch,1)) {
		    case -1:
			if (errno == EBADF) {
				descriptor = dupdescriptor;
				return(INTERRUPTED);
			} else return(...);
		    case 0:
			return(EOF);
		    default:
			return(ch);
		}
	}

--
-- 
--------------------------------------------------
| Simon Brown                                    |
| Laboratory for Foundations of Computer Science |
| Department of Computer Science                 |
| University of Edinburgh, Scotland, UK.         |
--------------------------------------------------
 UUCP:  uunet!mcvax!ukc!lfcs!simon
 ARPA:  simon%lfcs.ed at nss.cs.ucl.ac.uk      "Life's like that, you know"
 JANET: simon at uk.ac.ed.lfcs



More information about the Comp.unix.wizards mailing list