そういえば C で quine 書いた覚えがないなー、あと Linux のカーネルモジュール書いてみたいなー、と思ったので、練習として Linux のカーネルモジュールで quine を書いてみました。
ref: http://github.com/mame/kernel-mode-quine
ビルド方法。まず、環境にあわせて Makefile の KDIR をいじってください。Ubuntu ならいじらなくてもいけるかも。Debian だと linux-headers とか入れればこのままで行けるかも。とにかく make が通れば OK 。
$ vi Makefile $ make
insmod でカーネルにロードする。素人が書いたカーネルモジュールなので、何が起きても知りません。
$ sudo insmod ./quine.ko
/proc/quine ができてるはず。
$ ls /proc/quine/ Makefile quine.c
/proc/quine/quine.c は quine になっているはず。
$ diff /proc/quine/quine.c quine.c
疑い深い人はコピーして make してみてもよい。
$ mkdir /tmp/quine-build && cd /tmp/quine-build $ cp /proc/quine/quine.c /proc/quine/Makefile . $ sudo rmmod quine $ make $ sudo insmod ./quine.ko $ diff quine.c /proc/quine/quine.c $ diff Makefile /proc/quine/Makefile
遊び終わったら rmmod でカーネルからアンロードする。
$ sudo rmmod quine
quine 自体はとても普通。/proc/quine/quine.c の read proc の中から /proc/quine/quine.c 自身に再帰的にアクセスとかしたら面白いかと思ったけれど、カーネルモードからファイルを読み書きするのはぐぐってみると bad idea らしいのでやめといた。