システムプログラミング
日時:2017/06/19(本日は第二回)
参加者: /icons/hykw.icon /masuilab/Hikaru.icon
講義資料ないの? /masui/増井俊之.icon
argc argv
shellから取得できる引数
argc: 引数の個数
argv: 文字列の配列
code:argv/c
$ls -l osamu
の場合、
argcは 3
argvは ["/bin/ls", "-l", "osamu"]
echoを書け
argcやargv用いてコマンドライン引数をそのまま返すプログラムを作って提出せよ
code:echo.cpp
int main(int argc, const char * argv[]) {
for (int i= 0; i < argc; i++) {
}
printf("\n");
return 0;
}
こんなんでいいの?/icons/hykw.icon
引数の間に空白いれるべき /masui/増井俊之.icon
シェルスクリプト
シェルには簡単な言語やインタプリタが付属している
シェル自体が言語であると言うべきでは? /masui/増井俊之.icon
実行する場合はchmod等を使って権限を与える必要がある
code:chmod
$ chmod 0755 example.sh
forkというシステムコールを用いて子プロセスを生成する事もできる
ここ意味不明 /masui/増井俊之.icon
シェルで実行するとは?
シェルそのものは一つのプロセスでありながら、lsとかpwdとか別のプロセスをその上で実行できる
Executionという仕組みを用いている
そんな言葉あったっけ /masui/増井俊之.icon
fork+exec のことかな?
processをクローンして別のプログラムを走らせる
execvやexecl等のシステムコールを用いる
簡単なシェルを作れ
execlの第一引数は絶対パスでなければならない
execlpの場合は自動的に環境変数から探索してくれるらしい?/icons/hykw.icon
なのでlsを叩くと/bin/lsを指定する必要がある
末尾の改行コードも取り除かないといけない
発展
上で作ったシェルは/bin以下のコマンドしか実行できない
他のディレクトリにあるプログラムも指定できるとより汎用的なシェルになる!
プロセス間通信(IPC)
便利なpipeとかはこれを応用しているらしい
互いのファイルディスクリプタをプロセスと接続する
pipe()を作ってからFork()すると