ネットワーク・プログラミング
カーネルの役割とプロセス生成
1.1 OSの役割
仮想マシン
xfig
tar
時間多重化により各プロセス
にCPUを割当てる。
メモリ管理
ls
Latex
プロセス管理
OSはハードウェアの多様性
をカプセル化し、利用者を複
雑な処理から開放する。
オペレーションシステム(OS)
メモリ空間の多重化により、
各プロセスにメモリを割当る。
資源管理
各プロセスに資源(プリンタ、
ハードディスク等)の共有及び
アクセス保護のためのインタ
フェースを提供する。
周辺装置
メモリ
CPU
1.2
カーネルモードとユーザモード
カーネルモード
カーネルの特権モード。
プロセッサの全命令を利用
でき、全メモリ領域をアクセ
ス出来る。マシン資源と直
接対話出来る。
ユーザモード
プロセスの実行モード。
実行できる命令は制限さ
れ、ユーザモードのメモリ
領域のみアクセス出来る。
マシン資源と直接対話出
来ない。
システムコール
カーネルがプロセスに代
わってマシン資源をアクセ
スし、結果を返す。
プロセスA
システムコール
プロセスB
結果
カーネル
マシン資源とは
ハードディスク
等のハードウェ
アを指す
資源1
資源2
プロセスの生成とコマンドの実行
2.1 プロセスの生成
% man fork
fork 子プロセスを生成する
lv.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
インクルードファイル
/usr/include/stdlib.h
書式
戻値
int main(int argc,char *argv[]) { ポインタ変数の配列
int dep_time;
% man atoi
dep_time=atoi(argv[1])*60-300;
if (fork()==0) { //子プロセスの生成
sleep(dep_time);
fprintf(stderr,”Leave in 5 min\n”);
}
return EXIT_SUCCESS;
}
% gcc lv.c –o lv
% ./lv 30
%
% Leave in 5 min
説明
#include <sys/types.h>
#include <unistd.h>
pid_t fork (void);
成功時 親プロセス: 子プロセスID
子プロセス: 0
失敗時 -1
子プロセスは親プロセスの複製であ
り、戻値によって各プロセスは自身が
親か子かを判断する。
子プロセス pid=102
(30分後に予定あり)
親プロセス pid=100
子プロセスの生成
fork();
(5分前にアラーム)
戻値 102
戻値 0
fork();
2.2 簡単なシェルの作成
nsh.c
int main() {
char command[256],line[256];
int st;
static char prompt[64]=“>”;
プロンプト(>)を
ディスプレイ上に
表示
fprintf(stderr, “%s”,prompt);
while (fgets(line,sizeof(line),stdin) !=NULL) {
if (sscanf(line,”%s”,command)>0) {
if (fork()==0) {
if (execl(command,command,NULL)<0) {
子プロセス
が実行
exit(EXIT_SUCCESS);
}
commandを子プ
子プロセス終了
}
ロセス上で実行
else {
親プロセス
wait(&st);
が実行
}
}
fprintf(stderr,”%s”,prompt);
}
return EXIT_SUCCESS;
}
% ./nsh
> /bin/ps
プロセスの一覧が表示される
>/bin/ls
ファイル名一覧が表示される
> (Ctrl-Dを押すと、もとのシェルに戻る)
%
•
シェルとは、
1. 文字列を入力する
2. 入力された文字列で示されるコマ
ンド(プログラム)を実行
3. コマンドの実行が終ったら1.へ
•
nsh.cを実行しましょう。
2.3 プログラムの実行
execl プログラムをロードし実行
インクルードファイル
#include <unistd.h>
書式 int execl(const char *path, const char *arg, ..);
戻値
成功時 なし
失敗時 -1
説明
execlの引く数で指定したプログラムが
execlを呼出たプロセスを上書きする
プロセス
wait 子プロセスの終了を待つ
インクルードファイル
書式
戻値
親プロセス
execl(“/bin/ls”,”/bin/ls”,”-l”,NULL);
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int *status);
成功時 子プロセスID
失敗時 -1
子プロセス
fork();
子プロセスの生成
ハードディスク
wait();
/
execlを実行すると、
ハードディスクに格
納されたlsコマンド
をメモリ上にロード
する。
bin
ls
usr
子プロセスの
終了を待つ
exit();
親
宿題:20秒前と5秒前にメッセー
ジを出すプログラム(hw3.c)を作
成し、動作をlinux上で確認せよ。
表紙に氏名と学籍番号を書く
本文にプログラムを書く
プログラムの実行結果を書く
実施した内容を説明する文章を
書く
レポートの締切は次の週の水曜
日18:00
sleep(40)
printf()
fork()
return
sleep(15)
printf()
return
hw3.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int dep_time;
int dep_time2=15;
dep_time=atoi(argv[1])*60-20;
if (fork()==0) { //child
20秒前にメッセージ
(”Leave in 20 sec”)を
出力する命令文(2行)
をここに挿入する。
if (fork()==0) { //grandchild
sleep(dep_time2);
fprintf(stderr,"Leave in 5 sec\n");
}
$ ./hw3 1
$ Leave in 20 sec
Leave in 5 sec
$
孫
fork()
return
宿題3
子
5秒前にこのメッセージが出る
}
return EXIT_SUCCESS;
}
まとめ
OSの役割と構成
カーネルモードとユーザモード
プロセスの生成と実行
© Copyright 2026 ExpyDoc