次の機能を持つプログラムまたは関数を記述します。
- プログラム/関数は、最初に文字列
Hello, world!
を標準出力ストリームに書き込もうとします。(プログラム自体の些細な動作ではなく、I / Oに重点が置かれているため、この課題では他の形式の出力は受け入れられません。)成功したかどうかによって、次のようになります。- 出力に成功した場合
Hello, world!
、プログラム/関数はそれ以上動作せずに終了します。 - エラーのために正しい出力を生成できなかった場合、プログラム/関数は文字列
Error writing "Hello, world!"
を標準エラーストリームに書き込もうとします。(この課題では、エラー処理自体にエラー処理は必要ありません。)
- 出力に成功した場合
明確化
プログラム/関数は入力なしで実行されます(動作するために入力が絶対に必要な言語で記述されている場合を除きます。その場合、可能な限り単純な入力で実行されます)。
出力を生成する場合、必要に応じて単一の末尾改行を生成することもできますが、これは必須ではありません。
プログラムが実装する「標準出力への書き込みエラー」の定義では、少なくとも以下のケースをエラーとして扱う必要があります。
- 標準出力が存在しない(つまり
stdout
、閉じたファイルハンドルであり、ファイル記述子1が存在しない、またはこれらのケースが、使用している言語とOSに変換される)。 - 空き領域が残っていないディスク上のファイルを参照する標準出力。
- 接続の終わりをすでに閉じている別のプログラムに接続する標準出力。
そして、少なくとも以下のケースを成功(すなわち、エラーではない)として扱う必要があります:
- 標準出力は端末に接続され、
Hello, world!
画面に表示されます。 - 標準出力はファイルに接続し、ファイルに
Hello, world!
書き込まれます。
上記のルールに準拠している限り、出力エラーとして数える詳細を選択できます。
- 標準出力が存在しない(つまり
上記のエラー状況が発生しても、プログラム/関数がクラッシュすることはありません。使用する終了コードはあなた次第です。
プログラム/関数は、標準エラーストリームで発生したエラーの性質を記述しないでください。上で指定した文字列を出力するだけです。エラーが発生したかどうかに関係なく、標準エラー(コンパイラの警告など)の無関係な出力は、無条件に生成された場合にのみ有効です。
プログラムは1つのオペレーティングシステムでのみ動作する必要があります(ただし、上記のエラーが理にかなっている必要があります。ほとんどのマルチタスクコンシューマーオペレーティングシステムで動作するように十分に一般的なものにしようとしましたが、より奇妙なオペレーティングシステムでもかまいません。このチャレンジから除外されました)。プログラムが移植性がない場合は、提出するタイトルに、実行する必要がある前提条件をリストします。
このタスクは、すべての言語で可能であるとは限りません(すべての言語でプログラムがカスタムの方法で出力エラーを処理できるわけではありません)。可能な場合は言語を選択する必要があります。
プログラム/関数が機能することを確認してください!ライブラリ関数のドキュメントを信頼して、彼らが言うことを実行しないでください。単純な出力関数のエラー処理は、理論的には関数がエラーを処理すると主張している場合でも、実際には壊れていることがよくあります。
テストケース
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
最初の2つのテストケースは確定的です。最後はそうではありません(競合状態に依存します)。テストの目的で、エラーを公開する方法で競合状態を解決するために、プログラムの開始と実際の出力の間に標準出力に遅延を追加することをお勧めします。
勝利条件
これはコードゴルフの挑戦なので、短いほど良いです。(ほぼ)いつものように、プログラムの長さをバイト単位で測定しています。
sleep 1 < test; (sleep 2; your_program_here) > test
か?