Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!rutgers!ucsd!usc!henry.jpl.nasa.gov!elroy.jpl.nasa.gov!ucla-cs!arman From: arman@oahu.cs.ucla.edu (Arman Bostani) Newsgroups: comp.unix.wizards Subject: problems with async. I/O on streams Message-ID: <27197@shemp.CS.UCLA.EDU> Date: 18 Sep 89 06:25:13 GMT Sender: news@CS.UCLA.EDU Reply-To: arman@oahu.cs.ucla.edu (Arman Bostani) Organization: UCLA Computer Science Department Lines: 100 Pardon me if this question has been asked already ... I have been trying to get asynchronous I/O with streams working on sys-V to no avail. I have written a small program doing async. I/O with streams that works perfectly fine on a Sun-3 running 4.0.3. The program works by performing an I_SETSIG ioctl operation on stdin. When I have tried it on a couple of boxes running sys-V rel. 3.2, however, the ioctl returns an EINVAL (invalid argument) error. The streamio(7) manual has a little blurb about the fact that one will recieve an EINVAL if the file descriptor "is linked below a multiplexer". Has anyone seen this problem before? Is it possible at all to do async. I/O on ttys? If so, how does one go about it? I have included the text of a small program which runs into the problem mentioned above. Thanx for the help, arman. --------------------------------- #include #include #include #include #if defined(FNDELAY) # define NODELAY FNDELAY #elif defined(O_NDELAY) # define NODELAY O_NDELAY #else CROAK #endif #ifndef SIGPOLL # define SIGPOLL SIGIO #endif static int flags; /* * Called when we get a SIGPOLL. We read available input and spit it * out in hex. */ handler() { int c; fprintf(stderr, "got signal ...\n"); while((c = getchar()) != EOF) { fprintf(stderr, "char == 0x%x\n", c); } } bye() { fcntl(0, F_SETFL, flags &= ~NODELAY); /* reset to blocking I/O */ exit(0); } main() { /* asynchronous I/O interrpt handler */ signal(SIGPOLL, handler); /* reset to blocking mode and exit on intr, quit */ signal(SIGINT, bye); signal(SIGQUIT, bye); /* * put stdin in non-blocking mode. */ flags = fcntl(0, F_GETFL); fcntl(0, F_SETFL, flags |= NODELAY); /* * request SIGPOLL when input is available */ if (ioctl( 0, I_SETSIG, S_INPUT ) < 0) { perror("ioctl"); exit(1); } printf("type some chars followed by a carriage return to test.\n"); printf("type interrupt key to exit.\n"); /* loop forever, waiting for SIGPOLLs */ for (;;) ; } -- Arman Bostani // UCLA Computer Science Department -- arman@CS.UCLA.EDU // ...!(ucbvax,rutgers)!ucla-cs!arman