普段、コマンドプロンプトにコマンドを入力してbashなどのシェルに仲介してもらっていますが、
あまり中のことを気にしていませんでした。
大まかにでいいので、理解があっているか、確認できればと思います。
例えば、とあるシェルがCで書かれているとすると、
char cmd[256]; while(True){ scanf("%s", cmd); // ここでプロセスはスリープ(コマンド入力待ち) switch (&cmd){ case "echo": // fork() からの execev("/bin/echo.exe", ...); case "cd": // 組み込みコマンドをここで実行 case "./ + カレントディレクトリのプログラム": // fork() からの execev("./ANY.exe", ...); default: printf("そんなコマンド知りません。\n"); } }
・主に上のようなループ体制でユーザからの注文をカーネルが分かるものに"変換"している。
・当然シェル自体(プログラム)はメモリにロードされているので、そのバイナリがCPUによって実行さている。
・ウェブ上で調べると、変換などと何やら特殊なことをしているようだが、変換といっても単にあるコマンドが来たら、そのコマンドに対応する処理にswitchなどで分岐させているだけのこと。
・勝手に独自のシェルを作って使用されないように、OSの一部としてシェルを配布し、その渡したシェル以外からは一切カーネルへの注文を受け付けないように構築しておくことで、安全性を確保している。
・デーモンプロセスだろうと普通のプロセスだろうと、プロセスを生成する際には、必ず一度はシェルの子プロセスとして作られる。(シェルを通さずにプロセスを実行する手段、ルートはユーザには設けられていない。)
大体このような認識となっております。
何か認識のミス等ありましたら、ご教授ください。
回答2件
あなたの回答
tips
プレビュー