まずはドノーマルなC言語から
kt@ume% cat > hello.c #include <stdio.h> int main() { printf("hello world!\n"); return 0; } kt@ume% make hello cc hello.c -o hello kt@ume% PATH=.:$PATH hello hello world
ポイントがいくつかあります。
- cat を使うことで気分はBill Joy。でも間違ってEnterを押すと前の行には戻れません。行内でも間違いを見つけたらひたすらバックスペースで戻る以外に修正する術はなし。
- *.c ファイルのファイル名から .c を除いた文字列を make することで Makefile いらず。
- 私が小さい頃はカレントディレクトリをPATHに入れてるとグーで殴られました。他のPATHの前に入れるなんて、もってのほか。でも今はこうして安全な方法を編み出すことができました。./hello は邪道です。sh系限定ですcsh系とは違うんです。
kt@ume% precmd () { echo 'hello world!' } hello world! kt@ume% cd / hello world! kt@ume% ls a/ boot/ etc/ lib/ lost+found/ mnt/ proc/ sbin/ srv/ tmp/ var/ bin/ dev/ home@ lib64/ media/ opt/ root/ selinux/ sys/ usr/ hello world!
zsh では precmd という関数を定義することでプロンプト表示前に関数を実行してくれます。
bash の場合は PROMPT_COMMAND という変数に実行したいコマンドを定義しましょう。
[kt@susuki ~]$ PROMPT_COMMAND='echo hello world!' [kt@susuki ~]$ cd / hello world! [kt@susuki /]$ ls COPYRIGHT cdrom entropy lib proc sys a compat etc libexec rescue tmp bin dev home media root usr boot dist jail mnt sbin var hello world!
いつまでコマンドを叩いても hello world の表示が止まることはありません。良かったですね!
お次はネットワークを利用した hello world です。まずは FreeBSD 編
root@susuki# vi /etc/inetd.conf # ファイルの最後に以下の2行を加えます。 最後の hello は最初に作ってコンパイルしたコマンドを指定してください。 hello-port stream tcp nowait root /home/kt/misc/blog/hello/hello hello-port stream tcp6 nowait root /home/kt/misc/blog/hello/hello root@susuki# /etc/rc.d/inetd forcestart Starting inetd. root@susuki# telnet localhost hello-port Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. hello world! Connection closed by foreign host.
inetd から起動するプログラムは「標準入力=クライアントからの入力」「標準出力=クライアントへの出力」という前提で書かれています。逆に言うと普通に標準入出力でやりとりするプログラムを書けば、inetd から呼び出すことであっというまにサーバを書けます。
もちろんIPv6対応です。
root@susuki# telnet ::1 hello-port Trying ::1... Connected to localhost. Escape character is '^]'. hello world! Connection closed by foreign host.
すごいぞinetd!だてにインターネットスーパーサーバなんて大層な名前を背負ってませんね。
これを応用すればWebサーバだって楽勝です。
kt@susuki% cat > hello.c #include <stdio.h> int main() { printf("HTTP/1.0 200 OK\r\n"); printf("ContentType: text/plain;\r\n\r\n"); printf("hello world!\n"); return 0; } kt@susuki% make hello cc -O2 -fno-strict-aliasing -pipe hello.c -o hello kt@susuki% su - root@susuki# perl -pi.bak -e 's/^hello-port/http/;' /etc/inetd.conf root@susuki# /etc/rc.d/inetd forcerestart Stopping inetd. Starting inetd root@susuki# telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. HTTP/1.0 200 OK ContentType: text/plain; hello world! Connection closed by foreign host.
ここまでできたらお好みのWebブラウザで設定したホストにアクセスしてみましょう。hello world! と表示されましたか?
うまく行ったら、就職活動で「得意科目はぁープログラミング?ていうかぁ、Webサーバとか書いてましたぁ」と言い張ることができます。すごいですね!(本当にやって過度な期待を持たれても私は知りません)
続いてLinux編を・・・と思ったのですが、もう疲れたのでやめときます。Linuxの場合はxinetdでググれ。
それではここまで読んでいただいてありがとうございました。
気が向いたらまた書くかもしれません。ブログが続くかどうかもわかりませんが・・・
つづく!
0 件のコメント:
コメントを投稿