2008-01-01から1年間の記事一覧

poll()を使用したechoサーバの例 #include "unp.h" #define OPEN_MAX 16 int main(int argc, char **argv) { int i; int max_fd_index = 0; /* 利用可能なディスクリプタの最大の添字 */ int listen_fd; int connected_fd; int socket_fd; int num_of_ready_…

P.157より。select()を使用することにより、複数のディスクリプタに対してそれらの準備が出来るまで待つことが出来る。また、ソケットプログラミングにおいて相手側のコネクションがクロースするや否や、それを通知することが出来る。また、shutdown()を使用…

リチャードスティーブンス氏の著作より、簡単なTCP daytimeクライアントとサーバのコード。 daytimetcpcli.c #include "unp.h" int main(int argc, char **argv) { int socket_fd; int read_bytes; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr…

[Solaris] Apache2サービスの起動 SMFサービス詳細情報の確認 / # svcs -a | grep apache legacy_run 9月_16 lrc:/etc/rc3_d/S50apache ←Apacheはレガシーサービス disabled 9月_16 svc:/network/http:apache2 ←Apache2はSMFサービス / # svcs -l apache2 ←…

SMF(svc) Service Management Facility。共通マネージメントシステム。従来のSolarisでは、各サービスはinit.d以下のrcスクリプトから起動されていた。それに変わるもの。 Solarisコンテナ Solaris10の新機能。一台の物理ハードウェア上に複数の独立した実行…

初期設定 .profileを作成して、". .bashrc"行を追加 PATH=$PATH:/usr/ucb:/opt/sfw/bin:/opt/sfw/sbin/ export PATH TERM=vt100 export TERM alias cp='cp -i' alias emacs='TERM=linux emacs -nw' alias ls='ls -F' alias l.='ls -ld .*' alias ll='ls -l' …

sysconf()

POSIX では、アプリケーションがコンパイル時や実行時に、特定のオプションがサポートされているかや、設定可能な特定の定数や制限がどんな値かをテストすることができる。 以下が使用例 #include #define dprintld(expr) printf(#expr " = %ld\n", expr) in…

mmap

mmap()は、ファイルやデバイスをメモリにマップする。mmapを使用するとread()を使用しなくともwrite()が可能となる。つまり、バッファが不要となる。以下はファイル全体をマップする場合の例。 マッピングしたいファイルのサイズを取得する if (!(size = fil…

ド・モルガンの法則

1. !(P || Q) = !P && !Q 2. !(P && Q) = !P || !Q ド・モルガンの法則は多項でも成立するので、以下のような書き換えが可能。 (P || Q) && R → ( (!P && !Q) || !R)) 以下理由。 まず、全体を否定する。 !( (P || Q) && R) すると、法則2より、以下の書き換…

可変引数

関数は呼び出しに際して、個数や型が可変な引数をとることができる。インクルードファイル ではva_list 型が宣言されており、3つのマクロが定義されている。これらを用いると、呼び出された関数側では個数や型を知らない引き数のリストを、順に一つづつ読み…

プリプロセッサの##演算子

プリプロセッサ用の演算子##は、マクロ展開の最中に実引数を連結する。つまり以下の文は、 #define paste(front, back) front ## back paste(name, 1) 以下のように展開される。 name1

プリプロセッサの#記号

プリプロセッサ用の置き換えテキストの中で、パラメータ名の前に#記号が付いていれば、引用符付文字列に展開される。 つまり以下の文は、 #define dprintd(expr) printf(#expr " = %d\n", expr) dprintd(n); 以下のように展開される。 printf("n" " = %d\n",…

文字列ストリーム

fmemopen() や open_memstream() を使用して、文字列ストリームを作成することが出来る。これらの関数を使用すると、文字列やメモリバッファを入出力の対象にすることが出来る。fmemopen() は、必要に応じてメモリを動的に確保するため、メモリに書き込みを…

ビット演算を用いたエラトステネスのふるいの実装

エラトステネスのふるいは、素数を求めるアルゴリズム。 #include #include #include /* * 配列のしかるべき要素にある、望みのビットにアクセスするマクロ */ #define BITMASK(b) (1 素数は2からなので初期値は2 */ if (!BITTEST(bitarray, i)) { printf("%…

初期化と代入

自動変数に初期値が与えられていない場合、静的変数とは異なりゼロクリアされない。例えば以下の例の場合、str1とstr2の代入は等価であるように思えるが、実際には異なる。 char str1[10] = "abc"; char str2[10]; str2[0] = 'a'; str2[1] = 'b'; str2[2] = …

コプロセス

UNIXのフィルターとは、標準入力から読み標準出力へ書くプログラムのことである。例えば、catコマンドは標準入力から読み込んだ文字列を標準出力へ書き出すので、フィルターといえる。フィルターは普通、シェルのパイプラインで直列に接続される。それに対し…

popen()を使用したプログラムの例

他プロセスの出力を呼んだり、他プロセスへの入力を書いたりする為に他プロセスへのパイプを作成する操作が多い為、標準入出力ライブラリにはpopen()及びpclese()が用意されている。これらの関数は以下の処理を行う。 パイプを作成する 子をforkする 未使用…

pipe()を使用したプログラムの例

引数として与えられたファイルの内容をページャに渡して表示する。 #include #include "ourhdr.h" #define DEF_PAFER "/usr/bin/less" int main(int argc, char *argv[]) { int n, fd[2]; pid_t pid; char line[MAXLINE]; char *pager; char *argv0; FILE *f…

パイプ

パイプ(pipe)はUNIXの最も古いIPC(プロセス間通信)であり、全てのUNIXシステムで使用できる。パイプには2つの制約がある。 半二重である。データは一方向にしか流れない。 共通の祖先を持つプロセス間でのみ使用できる。普通、パイプを作ったプロセスがfork…

OOPの三大要素1 - クラス クラスとは、「まとめて、隠して、たくさん作る」仕組み。 サブルーチンと変数を「まとめる」。結びつきの強いサブルーチンとグローバル変数をまとめることが出来る。 クラス内部だけで使う変数やサブルーチンを「隠す」。グローバ…

アスペクト指向

ウィキペディアによれば、「オブジェクト指向とは直交する概念」らしい。

I/Oポートとは、CPUが外部チップや入出力デバイスとのデータやりとりをするための窓口のような回路のことである。 I/Oポートは別チップのレジスタなどに接続されていて、ハードウェア間での情報のやりとりに使用される。チップ側では、I/Oポートにアクセスさ…

asprintf()

asprintf()は、sprintf()に似ているが、出力文字列を (終端の NULL バイトも含めて) 保持するのに十分な大きさのメモリを確保し、最初の引数にその文字列へのポインタを返す。成功すると、出力されたバイト数を返す。メモリの割り当てができなかったり、その…