moore@hydra1f.cs.utk.edu (Keith Moore) (02/13/91)
This cropped up while I was trying to get GNU Emacs 18.57 running under SCO's ODT 1.0. I use both X and non-X environments, and would like a single emacs to work under both. If I compile the code for the non-X environment, without HAVE_SELECT defined, and I try to run subprocesses under emacs, the response is quite jerky as emacs emulates BSD select() by sleeping for a second at a time between read attempts. This works better with some devices (probably those that support ioctl FIONREAD) than others. If I define HAVE_SELECT and use the select() routine from the -lsocket library, emacs loops continuously displaying "select error: invalid argument" in the minibuffer. This happens even if the only fd being waited on is the terminal (in this case a pseudo-tty under an X window). If I compile emacs with X windows support, the select() routine from the socket library is required. This works okay while emacs is taking keyboard input from the X window, but breaks when I try to run a subprocess with input from a pipe. I worked around this by writing a version of pipe() that builds a tcp connection to the local machine, (since select() was obviously included for the purpose of porting BSD networking code), but the resulting emacs still breaks when I run it from a pseudo-tty or from the bare console. I assume that this is because the library select() routine is implemented in terms of the SYSV poll() syscall, and because neither pipes (as created by pipe()) nor pseudo-ttys (the kind X uses, anyway) support STREAMS. I am in the process of attempting to write a version of select() that uses ioctl(FIONREAD) as well as poll() as well as any other tricks I can think of to get it to work transparently without being too inefficient. Questions: 1. Can anyone verify my assumption that select() is broken because it uses poll(), or otherwise shed more light on this problem? 1. Has anyone else built a better version of select() for SYSV boxes? 3. I think there must be a streams pty that supports select(). Is it possible to get Xsight's xterm to use streams ptys? What do I lose if I use streams ptys instead of BSD-style? (For instance, can I still do FIONREAD and set window size or am I stuck with pure termios-style ioctls?) 4. Can anyone give me a pointer to a code example that builds a pipe using STREAMS? -- Keith Moore / U.Tenn CS Dept / 107 Ayres Hall / Knoxville TN 37996-1301 Internet: moore@cs.utk.edu BITNET: moore@utkvx