アカウント名:
パスワード:
putsの実行結果戻り値をハンドリングせずにプログラムを常に正常終了するようなコードなんだから、putsが成功しようが失敗しようが正常終了するのが当たり前に思えるんですけど。
> putsの実行結果戻り値をハンドリングせずに
知ったかぶってるけど、この場合 puts() の戻り値をチェックするだけでは不足なんだよ。やってみればすぐわかるけど、標準的な環境でファイルへの puts() は (メモリが足りてる限り) 必ず成功する。
書き込みエラーの確認をしたい場合には上に書かれているように、その後で fflush() とか fclose() して、その戻り値を確認する必要がある。
そこは本質じゃないと思うのですが。問題は「必ず正常終了するプログラムを実行したら必ず正常終了する。どこがバグ?」というところなので。# ま、正確には「puts()が失敗した時にプログラムを異常終了する処理なしに」と書くべきでしたね。
> 正確には「puts()が失敗した時にプログラムを異常終了する処理なしに」と書くべきでしたね。
やっぱりわかってないよね?今回の /dev/full にリダイレクトする条件では puts("Hello World") は失敗しないので、「puts() が失敗した時にプログラムが異常終了する処理」を記述したとしても違いはないよ。
そもそもputsが成功しているかすらチェックしていない、すなわち必ず書き込まれることを期待していないのだから書き込みに失敗していようが正常終了だろって意味では
いや、だから、今回の例では puts() は、確実に成功するので戻り値を確認する意味なんて元々ない。書き込まれたか確認したいなら、その後で fclose(stdout) して、その戻り値を確認するべき。(それで必要十分)。
それがputs()が失敗したかチェックするという事ではないのですか?
違います。puts() はバッファキャッシュに書き込む関数。バッファーキャッシュに書き込めれば成功。(その後で条件/実装によっては自動でフラッシュするけど、必ずしもフラッシュするわけではない)
素人向けに言い直すと puts()は書き込みの予約をする関数で、実際に書き出すのは別ということ。「予約する関数」なんだから予約さえできれば成功。今回の例だと main() からの return が「予約を実行して終了」という命令になる。ここでかわりに _Exit() とすれば「予約を破棄して終了」という命令になる。
putsのドキュメントにもエラーの場合EOFと書いてあってエラーになる可能性があるものをチェックすらしてないってことは、失敗していても正常終了とするのが仕様ってことですよ
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
何がバグなのかわからない (スコア:4, すばらしい洞察)
putsの実行結果戻り値をハンドリングせずにプログラムを常に正常終了するようなコードなんだから、putsが成功しようが失敗しようが正常終了するのが当たり前に思えるんですけど。
Re: (スコア:1)
> putsの実行結果戻り値をハンドリングせずに
知ったかぶってるけど、この場合 puts() の戻り値をチェックするだけでは不足なんだよ。
やってみればすぐわかるけど、標準的な環境でファイルへの puts() は (メモリが足りてる限り) 必ず成功する。
書き込みエラーの確認をしたい場合には上に書かれているように、その後で fflush() とか fclose() して、
その戻り値を確認する必要がある。
Re: (スコア:0)
そこは本質じゃないと思うのですが。
問題は「必ず正常終了するプログラムを実行したら必ず正常終了する。どこがバグ?」というところなので。
# ま、正確には「puts()が失敗した時にプログラムを異常終了する処理なしに」と書くべきでしたね。
Re: (スコア:0)
> 正確には「puts()が失敗した時にプログラムを異常終了する処理なしに」と書くべきでしたね。
やっぱりわかってないよね?
今回の /dev/full にリダイレクトする条件では puts("Hello World") は失敗しないので、「puts() が失敗した時にプログラムが異常終了する処理」を記述したとしても違いはないよ。
Re: (スコア:0)
そもそもputsが成功しているかすらチェックしていない、すなわち必ず書き込まれることを期待していないのだから
書き込みに失敗していようが正常終了だろって意味では
Re: (スコア:0)
いや、だから、今回の例では puts() は、確実に成功するので戻り値を確認する意味なんて元々ない。
書き込まれたか確認したいなら、その後で fclose(stdout) して、その戻り値を確認するべき。(それで必要十分)。
Re: (スコア:0)
それがputs()が失敗したかチェックするという事ではないのですか?
Re: (スコア:0)
違います。
puts() はバッファキャッシュに書き込む関数。バッファーキャッシュに書き込めれば成功。(その後で条件/実装によっては自動でフラッシュするけど、必ずしもフラッシュするわけではない)
素人向けに言い直すと puts()は書き込みの予約をする関数で、実際に書き出すのは別ということ。「予約する関数」なんだから予約さえできれば成功。今回の例だと main() からの return が「予約を実行して終了」という命令になる。ここでかわりに _Exit() とすれば「予約を破棄して終了」という命令になる。
Re:何がバグなのかわからない (スコア:0)
putsのドキュメントにもエラーの場合EOFと書いてあってエラーになる可能性があるものをチェックすらしてないってことは、失敗していても正常終了とするのが仕様ってことですよ