Escriba un programa o función con la siguiente funcionalidad:
- El programa / función primero intenta escribir la cadena
Hello, world!
en la secuencia de salida estándar. (No se aceptan otras formas de salida para este desafío, ya que el enfoque se centra principalmente en la E / S y no en el comportamiento trivial del programa en sí mismo). Dependiendo de si tuvo éxito:- Si tuvo éxito en la salida
Hello, world!
, el programa / función se cierra sin ningún comportamiento adicional. - Si no pudo producir la salida correcta debido a un error, el programa / función intenta escribir la cadena
Error writing "Hello, world!"
en la secuencia de error estándar. (Para los propósitos de este desafío, no necesita manejo de errores para el manejo de errores en sí).
- Si tuvo éxito en la salida
Aclaraciones
Su programa / función se ejecutará sin entrada (a menos que esté escrito en un lenguaje que requiera absolutamente entrada para funcionar, en cuyo caso se ejecutará con la entrada más simple posible).
Al producir resultados, también puede producir una nueva línea final si lo desea, pero hacerlo no es obligatorio.
La definición de "error al escribir en la salida estándar" que implementa su programa debe tratar al menos los siguientes casos como errores:
- La salida estándar no
stdout
existe ( es decir, es un identificador de archivo cerrado, no existe un descriptor de archivo 1 o, sin embargo, esos casos se traducen al idioma y al sistema operativo que está utilizando); - Salida estándar que se refiere a un archivo en un disco que no tiene espacio libre restante;
- Salida estándar que se conecta a otro programa, que ya ha cerrado su final de la conexión.
y debe tratar al menos los siguientes casos como exitosos (es decir, no como un error):
- La salida estándar se conecta a un terminal y
Hello, world!
se muestra en la pantalla. - La salida estándar se conecta a un archivo y
Hello, world!
se escribe en el archivo.
Puede elegir los detalles de lo que cuenta como un error de salida, siempre que sea coherente con las reglas anteriores.
- La salida estándar no
Su programa / función no debe bloquearse al encontrar cualquiera de las situaciones de error enumeradas anteriormente. Depende de usted qué código de salida usa.
Su programa / función no debe describir la naturaleza del error encontrado en la secuencia de error estándar; solo debe imprimir la cadena especificada anteriormente. El resultado extraño en un error estándar (p. Ej., Advertencias del compilador) solo es legal si se produce incondicionalmente, independientemente de si se encuentra un error o no.
Su programa solo necesita funcionar en un sistema operativo (aunque debe ser uno en el que los errores enumerados anteriormente tengan sentido; he tratado de mantenerlos lo suficientemente generales como para funcionar en la mayoría de los sistemas operativos de consumo multitarea, pero los sistemas operativos más extraños pueden ser excluidos de este desafío). Si su programa no es portátil, enumere las suposiciones que necesita ejecutar en el título de su envío.
Es posible que esta tarea no sea posible en todos los idiomas (no todos los idiomas permiten que un programa maneje errores de salida de forma personalizada). Tendrás que elegir un idioma donde sea posible.
¡Asegúrese de que su programa / función funcione! No solo confíe en la documentación de las funciones de la biblioteca para hacer lo que dicen que hacen. El manejo de errores de funciones de salida simples a menudo se rompe en la práctica, incluso si las funciones afirman manejar errores en teoría.
Casos de prueba
Aquí hay una manera de simular cada una de las condiciones de error anteriores usando bash
Linux (no es necesario que use Linux, pero es probable que sea el sistema más fácil para probar esto):
your_program_here >&- # nonexistent stdout
your_program_here > /dev/full # out of disk space
mkfifo test # note: change "test" to a filename that isn't in use
true < test &
your_program_here > test # connecting to a program that doesn't want input
rm test # clean up the FIFO we used earlier
Los dos primeros casos de prueba son deterministas. El último no es (se basa en una condición de carrera); Para fines de prueba, recomiendo agregar un retraso entre el inicio de su programa y la salida real a la salida estándar, para garantizar que la condición de carrera se resuelva de la manera que expone el error.
Condición de victoria
Este es un desafío de código de golf , por lo que más corto es mejor. Como (casi) siempre, estamos midiendo la longitud del programa en bytes.
sleep 1 < test; (sleep 2; your_program_here) > test
?