Que se acabe el tiempo

setillo
11 de Febrero del 2004
Tengo una impresora que puede estar en el puerto LPT1, LPT2 o LPT3.

Para ello

FILE * impresora = fopen ("LPT1:","w") ;
fprintf(impresora, "HOLAn") ;
fclose (impresora) ;

El problema es que si está en el puerto LPT1 la impresora y abro el puerto LPT2. No me devuelve NULL y cuando mando el fprintf no da fallo. Sino que simplemente se queda como clavado ahí.

¿Cómo puedo hacer que si hace 3 segundos que he enviado el fprintf y no se ha acabado la función dé un mensaje de error de que la impresora está mal conectada?

SirThomas
11 de Febrero del 2004
Este problema lo he resuelto de manera chapuza total.
Mi problema era un bloqueo en un socket de red, pero el caso es el mismo.
Lo que hago es crear un proceso hijo que atendería al puerto de la impresora, mientras el padre duerme 3 segundos (sleep(3);). Cunado el padre despierta mata al proceso hijo mediante el pid (lo da la funcion fork()). De esta manera a los tres segundos tu programa sigue con su trabajo.
Para saber si el proceso hijo a muerto porque habia terminado su trabajo o porque el padre lo ha matado bastaría hacer una pipe o bien, escribir en un fichero el resultado que te interesa pasar al padre. Si el fichero no está es que el hijo estaba bloqueado y el padre lo ha matado.

Problema de esta estrategia, además de no ser óptimo ni nada que se le parezca: tu programa siempre estará tres segundos colgado, funcione o no el puerto.

Espero que te sirva y que alguien nos de una solución más elegante :)

setillo
11 de Febrero del 2004
Muchas gracias.

La verdad que un poco bestia sí que me parece. :D
Creo que hay una jugando con timers, pero es que me queda muy atrás en la mente.

Esperemos que un alma caritativa nos eche una mano.