编写具有以下功能的程序或函数:
- 程序/函数首先尝试将字符串写入
Hello, world!
标准输出流。(此挑战没有其他形式的输出是可以接受的,因为重点是I / O而不是程序本身的琐碎行为。)取决于程序是否成功:- 如果成功输出
Hello, world!
,则程序/功能将退出而没有任何进一步的行为。 - 如果由于错误而未能产生正确的输出,则程序/函数会尝试将字符串写入
Error writing "Hello, world!"
标准错误流。(出于此挑战的目的,您无需为错误处理本身进行错误处理。)
- 如果成功输出
澄清说明
您的程序/函数将在没有输入的情况下运行(除非以绝对需要输入才能正常工作的语言编写,在这种情况下,它将使用最简单的输入来运行)。
产生输出时,如果愿意,也可以产生一个尾随换行符,但这不是强制性的。
程序实现的“写入标准输出错误”的定义必须至少将以下情况视为错误:
- 不存在标准输出(即,
stdout
是封闭的文件句柄,不存在文件描述符1,或者这些情况会转换为您使用的语言和操作系统); - 标准输出,指的是磁盘上没有可用空间的文件;
- 标准输出连接到另一个程序,该程序已经关闭了连接的末端。
并且必须至少将以下情况视为成功(即不是错误):
- 标准输出连接到终端,并
Hello, world!
显示在屏幕上。 - 标准输出连接到文件,并
Hello, world!
写入文件中。
您可以选择什么才是输出错误的详细信息,只要它与上述规则一致即可。
- 不存在标准输出(即,
遇到上面列出的任何错误情况,您的程序/功能都不会崩溃。由您决定使用哪种退出代码。
您的程序/函数不应在标准错误流上描述遇到的错误的性质;它应该只打印上面指定的字符串。标准错误的无关输出(例如,编译器警告)只有在无条件产生的情况下才是合法的,无论是否遇到错误。
您的程序仅需要在一个操作系统上运行(尽管必须是上面列出的错误才有意义的操作系统;我试图使它们具有足够的通用性,以使其能够在大多数多任务消费者操作系统上运行,但是怪异的操作系统可能会排除在此挑战之外)。如果您的程序不可移植,请在提交的标题中列出需要运行的假设。
并非每种语言都可能完成此任务(并非每种语言都允许程序以自定义方式处理输出错误)。您必须选择一种可能的语言。
确保您的程序/功能有效!不要仅仅相信库函数的文档就能完成他们说的事情。简单的输出函数的错误处理在实践中常常被证明是错误的,即使函数声称在理论上处理错误。
测试用例
这是一种bash
在Linux 上使用的方法,可以模拟上述每种错误情况(您不必使用Linux,但这可能是最简单的测试系统):
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
前两个测试用例是确定性的。最后一个不是(它取决于比赛条件)。出于测试目的,我建议在程序启动与实际输出到标准输出之间增加一个延迟,以确保以暴露错误的方式解决竞争状况。
胜利条件
这是一个 代码高尔夫球挑战,所以越短越好。与(几乎)总是一样,我们正在测量程序的长度(以字节为单位)。
sleep 1 < test; (sleep 2; your_program_here) > test
吗?