GRADUATION
プログラムがOSに何を頼んでいるかを、自分の目で見られるようになりました。
write()だけを呼ぶ、ごく単純なプログラムをstraceで観察し、printf1つの裏で何十ものシステムコールが動いていることを見ました。write(1, ...)という1行の呼び出しが、fd・バッファ・長さという3つの引数と、書き込んだバイト数という返り値を持つ、OSとの明確な契約だと理解しました。
おつかれさまでした。
持ち帰るもの
- プログラムは、勝手に画面に文字を出せない「文字を出す」という一見当たり前の動作も、write()というシステムコールを通じてOSに頼んでいます。ユーザー空間のプログラムに、直接デバイスを操作する権限はありません。
- システムコールには、引数と返り値があるwrite(fd, buf, count)は「このファイルディスクリプタに、このバッファの、この長さぶんを書け」という具体的な依頼で、返り値は「実際に書けたバイト数」です。
- straceは、その依頼のやり取りをすべて見せてくれる-e trace=で絞り込めば、膨大な出力の中から見たいシステムコールだけを追えます。
次にやるといいこと
- 次は、そのプログラムが動いている「プロセス」そのものをのぞくmini-procです。
- sec-cで見たバッファオーバーフローも、結局はこうしたシステムコール(read/writeなど)に渡すバッファの管理ミスから始まります。