2009年8月20日木曜日

hello world!

最初はみんなこれでしょ、ということで hello world の書き方です。
まずはドノーマルな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

ポイントがいくつかあります。
  1. cat を使うことで気分はBill Joy。でも間違ってEnterを押すと前の行には戻れません。行内でも間違いを見つけたらひたすらバックスペースで戻る以外に修正する術はなし。
  2. *.c ファイルのファイル名から .c を除いた文字列を make することで Makefile いらず。
  3. 私が小さい頃はカレントディレクトリをPATHに入れてるとグーで殴られました。他のPATHの前に入れるなんて、もってのほか。でも今はこうして安全な方法を編み出すことができました。./hello は邪道です。sh系限定ですcsh系とは違うんです。
続いてシェル上での hello world
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 件のコメント:

コメントを投稿