2007-09-01から1ヶ月間の記事一覧

シグナルハンドラの継承

プログラムがexecされた時、シグナルハンドラは継承されない。また、シグナルの登録状況はSIG_IGN(無視)のもののみが継承され、他のシグナルはSIG_DFE(デフォルト)にリセットされる。一方、プロセスがforkされた時、子は親のシグナルハンドラと登録状況を継…

signal関数の使用例

#include #include "ourhdr.h" /* シグナルハンドラの定義 */ static void sig_usr(int signo) { if (signo == SIGUSR1) { printf("received SIGUSER1\n"); } else if (signo == SIGUSR2) { printf("received SIGUSER2\n"); } else { err_dump("received sig…

MTD(Memory Technology Device)

MTDは、メモリデバイス、特にフラッシュメモリを扱う為に、ハードウェアドライバと上位層(ファイルシステム等)との間に汎用インターフェースを提供するサブシステムである。ハードウェアドライバモジュールと上位層としてのユーザモジュールとの2種類のモジ…

ゾンビプロセスを生成しないテクニック

子プロセスが終了するのを待ちたくないし、かといって子プロセスをゾンビにしたくない場合、fork()を2度呼ぶ方法がある。 #include #include #include "ourhdr.h" int main(void) { int res; pid_t pid; pid_t ppid; pid = fork(); if (pid 0) { /* 子プロセ…

ゾンビプロセス

カーネルは、終了したプロセスに関する情報を保存しておき、プロセスの親がwait()やwaitpid()をcallした時にその情報を利用出来るようにする必要がある。必要最小限の情報は、プロセスID、終了状態、CPU時間である。親プロセス側からwait操作が行われること…

fork()とバッファリング

標準入出力のバッファリングには、行バッファリングと完全バッファリングがある。標準出力が端末に繋がっていると行バッファリングされ、それ以外の時は完全バッファリングされる。 下記のfork()の使用例では、標準出力に対して出力した場合、行バッファなの…

x86のブートプロセス

以下はGRUBでのx86のブートプロセスだが、やや曖昧な部分があるので、いずれ補完が必要だと思う。 電源投入後、CPUはシステムメモリの最後部を見てBIOSプログラムを探し、実行する。 BIOSは、システムをブートする有効なデバイス(CD-ROM, FDD, HDD等)を探す…

プログラムのメモリ配置

●textセグメント プログラムの命令群。 ●dataセグメント 初期化されたデータセグメント。初期化された変数を保持する。 ●bssセグメント 初期化されないデータセグメント。プログラムの開始前にカーネルによって0に初期化される。 アセンブラの"block started…

標準入出力のための短縮形ルーチン(代替関数)

短縮形 同義語 備考 =============================================================================================== getchar() fgetc(stdin), getc(stdin) gets(buf) fgets(buf, BUFSIZE, stdin) gets()は絶対に使用してはならない。 printf(args) fpr…

特殊装置ファイル(スペシャルデバイス)

lstat()で取得する情報のうち、st_devとst_rdevは混同しがちなので注意する。 #include #include #include "ourhdr.h" int main(int argc, char *argv[]) { int i; int res; struct stat buf; for (i = 1; i ファイルシステムのメジャー装置番号(ディス * ク…

nftw()

nftw()は、ファイルツリーを歩きまわる関数。以下が使用例。 #define _XOPEN_SOURCE 500 /* ftw.hのinclude前にdefineしなければならない */ #include #include #include #include #define ARG_MAX 50 /* 値に根拠は無い。もっと小さくても良いはず。 */ sta…