Que se acabe el tiempo
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?
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?
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 :)
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 :)
