Skip to content

new page bufsiz.md #1477

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 23, 2025
Merged

new page bufsiz.md #1477

merged 4 commits into from
Jul 23, 2025

Conversation

rotarymars
Copy link
Member

No description provided.

@rotarymars
Copy link
Member Author

確認をお願いします。

Copy link
Contributor

github-actions bot commented Jul 19, 2025

プレビュー (HTML) (更新時刻: 2025-07-20 20:12:07 JST)

  • Commit: fd7a507
  • プレビューの生成には時間がかかります (3~5分)。進捗状況はこちらをご確認ください。

変更記事一覧

2件の記事が変更されました。

※ソース (.md) に直接変更のあった記事を列挙しています。グローバル修飾や変換規則の変更による変化は考慮していません。

Copy link
Member

@akinomyoga akinomyoga left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

特に他の方からのコメントもないようなのでOK

因みに Linux で最も一般的な glibc では 8192 です (プレビューのコードブロックに表示される実行ボタンを押してもそれがわかりますね)。 newlib/bionic/musl および Minix, FreeBSD では 1024 でした。

@rotarymars
Copy link
Member Author

ありがとうございます。
自分の環境でも8192ではありましたが、一般的に1024だと読んだので1024にしていました。
マージします。

@rotarymars rotarymars merged commit ffd0531 into cpprefjp:master Jul 23, 2025
9 checks passed
@akinomyoga
Copy link
Member

うーん…一般的に 1024 というのは何処が出典ですか?

@rotarymars
Copy link
Member Author

実行環境依存なので、調べていると1024が多そうに見えました。
一応下の3つのサイトは1024であることを確認しました。

@akinomyoga
Copy link
Member

1つ目は環境不明(2007年頃)で、2つ目は(標準ライブラリのBUFSIZの話ではなくて)自分で定義した read(2) 用のバッファの話で関係なくて、3つ目はmacOSですね。macOS は持っていないのでランタイムが具体的にどういう構成になっているのか知りませんが、C関連がFreeBSDの構成を元にしていると思って良いならば 1024 というのは自然です。mingw が 512 なのは恐らく Visual C++ のランタイムを踏襲しているからで…今確認したらやっぱり setbuf は msvcrt へのダイナミックリンクですね:

$ x86_64-w64-mingw32-gcc -xc - <<< $'#include <stdio.h>\nint main(){char b[BUFSIZ];setbuf(stdout,b);}'
$ objdump -x a.exe | sed -n '/msvcrt\.dll/,/^$/p'
        DLL Name: msvcrt.dll
        vma:     Ordinal  Hint  Member-Name  Bound-To
        000081c0  <none>  0059  __C_specific_handler
        000081c8  <none>  0081  __getmainargs
        000081d0  <none>  0082  __initenv
        000081d8  <none>  0083  __iob_func
        000081e0  <none>  0093  __set_app_type
        000081e8  <none>  0095  __setusermatherr
        000081f0  <none>  00ae  _amsg_exit
        000081f8  <none>  00cb  _cexit
        00008200  <none>  00dd  _commode
        00008208  <none>  0143  _fmode
        00008210  <none>  019f  _initterm
        00008218  <none>  02c4  _onexit
        00008220  <none>  0475  abort
        00008228  <none>  0486  calloc
        00008230  <none>  0494  exit
        00008238  <none>  04a8  fprintf
        00008240  <none>  04b1  free
        00008248  <none>  04bd  fwrite
        00008250  <none>  04ec  malloc
        00008258  <none>  04f5  memcpy
        00008260  <none>  0512  setbuf
        00008268  <none>  0516  signal
        00008270  <none>  052c  strlen
        00008278  <none>  052f  strncmp
        00008280  <none>  0553  vfprintf

なので msvcrt は 512 ということ。


以下によると The Unix Programming Environment (1984) に 512 または 1024 が最も多く使われると書かれているみたいですが…(でも40年前の情報…)

以下は 512~8192 と書いています (さすがきじねこ…)

ところで上の記事に

標準規格では、その値は256バイト以上と定められています。

って書いてあって、えって思ったら、7.21.2/p9 にちゃんとそう書かれていますね…。

@rotarymars
Copy link
Member Author

ありがとうございます。
自分の環境以外でのサンプルを参照するときにはしっかり読むようにします。

MinGW環境でもMSVCの古いランタイムが使われているのですね。

@yohhoy
Copy link
Member

yohhoy commented Jul 24, 2025

標準規格では、その値は256バイト以上と定められています。

って書いてあって、えって思ったら、7.21.2/p9 にちゃんとそう書かれていますね…。

例えば下記のように明記してもよいかもですね。
「値は実装依存であるが256以上となることは保証されており、一般的には512バイトや1024バイトなどの値が使用される。」

Environmental limits
An implementation shall support text files with lines containing at least 254 characters, including the terminating new-line character. The value of the macro BUFSIZ shall be at least 256.

FYI: C標準規格では "at least N" という言い回しが頻出し、全ての処理系に求める最低保証ラインを定義していたりします。

@akinomyoga
Copy link
Member

akinomyoga commented Jul 24, 2025

BUFSIZ の場所 (C17 §7.21.1) では何も言っていなくて、次のセクションの末尾 (C17 §7.21.2) でおもむろに現れているのが盲点でした。C++規格だと、最低値はだいたい当該箇所に書かれていて、あるいは Annex B に処理系限界の推奨値が書かれているような気がしますが、C規格では Environmental limits という種類のセクションがぽつぽつとあって微妙に集約されているのですね。。。

@rotarymars
Copy link
Member Author

「値は実装依存であるが256以上となることは保証されており、一般的には512バイトや1024バイトなどの値が使用される。」

こちらの方はそのままプッシュしても良いですか?

@akinomyoga
Copy link
Member

ok

@rotarymars
Copy link
Member Author

rotarymars commented Jul 24, 2025

こんな感じでどうでしょうか?
24dc108

@akinomyoga
Copy link
Member

良いと思います! 後で何処に経緯があったかわからなくなるので commit message にリンクがあると良いです。

https://github.com/cpprefjp/site/pull/1477#issuecomment-3112578860

個人的には、一文を無駄に長くする理由もないので、文を切ってもいいかな (~保証されている。一般的には~) って気がしますが、飽くまでコメントということで。

@akinomyoga
Copy link
Member

あ、もう push されているから commit message 弄れないですね…

@rotarymars
Copy link
Member Author

あ、もう push されているから commit message 弄れないですね…

すみません。すみません。関連するものに次回からは貼るようにします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants