hans@umd5.umd.edu (Hans Breitenlohner) (05/31/90)
In article <1892@gannet.cl.cam.ac.uk> maj@cl.cam.ac.uk (Martyn Johnson) writes: >Ever since we've had our DECstation 3100s and DECsystem 5400s we've been >troubled with user processes which should have gone away sitting eating >CPU time instead. I have fixed one such problem with Mail. Diffs follow below. The problem was that a routine sits and spins forever when getting an error on stdin (such as a dropped network connection). The old assumption that errors on stdin are temporary is not valid any more. Berkeley has fixed that problem long ago, but Ultrix's /usr/ucb/Mail is based on sources that are about six years old. I would suspect that similar mechanisms are involved in the problems you see. *** fio.c.old Wed Oct 4 13:19:48 1989 --- fio.c Thu Oct 5 18:59:13 1989 *************** *** 175,180 return(c+1); } /* * Quickly read a line from the specified input into the line * buffer; return characters read. --- 175,181 ----- return(c+1); } + #if 0 /* * Quickly read a line from the specified input into the line * buffer; return characters read. *************** *** 206,211 *cp = 0; return(cp - linebuf + 1); } /* * Read up a line from the specified input into the line --- 207,213 ----- *cp = 0; return(cp - linebuf + 1); } + #endif /* * Read up a line from the specified input into the line *************** *** 220,226 register char *cp; register int c; - do { /*read while no errs & stdin ==file*/ clearerr(ibuf); /*reset err indication on input*/ c = getc(ibuf); for (cp = linebuf; c != '\n' && c != EOF; c = getc(ibuf)) { --- 222,227 ----- register char *cp; register int c; clearerr(ibuf); /*reset err indication on input*/ c = getc(ibuf); for (cp = linebuf; c != '\n' && c != EOF; c = getc(ibuf)) { *************** *** 229,235 if (cp - linebuf < LINESIZE-2) *cp++ = c; } - } while (ferror(ibuf) && ibuf == stdin); *cp = 0; /*terminates line*/ if (c == EOF && cp == linebuf) /*if @ beginning of line & char=EOF*/ return(0); /* then return 0*/ --- 230,235 ----- if (cp - linebuf < LINESIZE-2) *cp++ = c; } *cp = 0; /*terminates line*/ if (c == EOF && cp == linebuf) /*if @ beginning of line & char=EOF*/ return(0); /* then return 0*/