見出し画像

「[試して理解]Linuxのしくみ」今日も第1章の続き

シグナル」を見終わりました。最後は、希望が持てる終わり方で、それまで「ハラハラドキドキ」し続けていた気持ちが、なんとか落ち着きました。オリジナルが良すぎたので、改めて日本のリメイク版「シグナル 長期未解決事件捜査班」を見直したくなってしまいました。これは、無限ループ?さて、「[試して理解]Linuxのしくみ」まだ1章のはじめなので、続きを読まねばという気持ちです。今日も試しながら読みます。

今日は、ちょっとだけ試して理解

今日は、日中換気扇の掃除をしたり、冷蔵庫の掃除をしたりして、あまり学習時間が取れなかったので、ちょっとだけ。

システムコールの所要時間

straceに-Tオプションを付けて各システムコールの処理にかかった時間をマイクロ秒で採取してみました。私の環境では、"hello world\n"を出力するのにかかった時間は、123マイクロ秒でした。

$ strace -T -o hello.log ./hello
hello world
$ cat hello.log
execve("./hello", ["./hello"], 0x7ffce0083318 /* 38 vars */) = 0 <0.001729>
arch_prctl(ARCH_SET_FS, 0x55e0f0)       = 0 <0.000130>
         :
write(1, "hello world\n", 12)           = 12 <0.000123> ←

標準Cライブラリ

プログラムがどんなライブラリをリンクしているかは、lddコマンドで確認できるようなので、echoコマンドをlddコマンドで確認してみます。

$ ldd /bin/echo
        linux-vdso.so.1 (0x00007ffc291da000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f70e4ecd000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f70e50ee000)

このうち、libc.so.6が、標準Cライブラリだそうです。こんなふうに、標準コマンドがどんなライブラリを使用しているかがわかるのは面白いです。続いて、catコマンドと、pythonについても調べてみます。

$ ldd /bin/cat
        linux-vdso.so.1 (0x00007ffcb8fc7000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2af0e99000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2af10bb000)
$ $ ldd /usr/bin/python3
        linux-vdso.so.1 (0x00007fff04572000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f53a32c2000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f53a329f000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f53a3299000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f53a3294000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f53a3145000)
        libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f53a3117000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f53a30f9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f53a34d8000)

本に書かれているとおり、catコマンドも、pythonも標準Cライブラリを使用していることを確認できました。C言語が生きているってわかるのは、楽しいです。続けてライブラリファイルを確認してみます。

$dpkg-query -W | grep ^lib
      :
libgmp10:amd64  2:6.2.0+dfsg-4ubuntu0.1
libgmpxx4ldbl:amd64     2:6.2.0+dfsg-4ubuntu0.1
libgnome-autoar-0-0:amd64       0.2.3-2ubuntu0.4
libgnome-bluetooth13:amd64      3.34.3-0ubuntu1
libgnome-desktop-3-19:amd64     3.36.8-0ubuntu1
libgnome-games-support-1-3:amd64        1.6.1-1
libgnome-games-support-common   1.6.1-1
libgnome-menu-3-0:amd64 3.36.0-1ubuntu1
libgnome-panel0 1:3.36.2-0ubuntu1
libgnomekbd-common      3.26.1-1

ずらっと、たくさんのパッケージ名が表示されました。満足です。

まとめ

標準コマンドに標準Cライブラリがリンクされているということは、C言語で書かれたプログラムだということですね。C言語はUNIXカーネルを書くために作られたんじゃなかったっけ?と思って、検索したら、「カーネルがC言語で書かれているということが納得できません」という質問があって、その解答がとても丁寧で良きです。来週は、もう少し学習時間を確保できると良いな。

この記事が気に入ったらサポートをしてみませんか?