Establecer un tiempo de espera para leer la entrada estándar

¿Hay alguna manera de pasar el tiempo de lectura de la entrada estándar para que el progtwig no se cuelgue por mucho tiempo?

read(0, var, numberofbytes); 

Puede usar ncurses o, si no lo desea, puede usar seleccionar como se describe en esta publicación de blog . Básicamente, puede utilizar select y especificar el tiempo de espera. Si se establece el FD estándar, entonces puedes leerlo de manera segura y no se bloqueará. Si quieres más información sobre selección, mira esto y por supuesto wikipedia . Es una llamada práctica para saber.

EDITAR: Me siento obligado a proporcionar código, así que aquí está, directamente de la publicación del blog con algunos comentarios.

 // if != 0, then there is data to be read on stdin int kbhit() { // timeout structure passed into select struct timeval tv; // fd_set passed into select fd_set fds; // Set up the timeout. here we can wait for 1 second tv.tv_sec = 1; tv.tv_usec = 0; // Zero out the fd_set - make sure it's pristine FD_ZERO(&fds); // Set the FD that we want to read FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0 // select takes the last file descriptor value + 1 in the fdset to check, // the fdset for reads, writes, and errors. We are only passing in reads. // the last parameter is the timeout. select will return if an FD is ready or // the timeout has occurred select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); // return 0 if STDIN is not ready to be read. return FD_ISSET(STDIN_FILENO, &fds); } 

Use select, poll o cualquier otra instalación de multiplexación de IO. Todos ellos toman un argumento de tiempo de espera. Tenga en cuenta que esto no funcionará si stdin es un archivo normal, pero si stdin es un terminal / tty, socket, pipe.

p.ej

 fd_set selectset; struct timeval timeout = {10,0}; //timeout of 10 secs. int ret; FD_ZERO(&selectset); FD_SET(0,&selectset); ret = select(1,&selectset,NULL,NULL,&timeout); if(ret == 0) //timeout else if(ret == -1) //error else // stdin has data, read it // (we know stdin is readable, since we only asked for read events //and stdin is the only fd in our select set. 

Llame a alarm() o ualarm() antes de llamar a read() . Esto hará que se entregue una señal SIGALRM al proceso, interrumpiendo la lectura (), siempre y cuando no le haya dicho al O / S que reinicie las llamadas del sistema después de las interrupciones. Asegúrese de cancelar la alarma si el read() regresa normalmente.