Linuxでは、ユーザーはbash、sh、cshなどのコマンドをシェルに挿入します。ユーザーがシェルのカーネル位置にコマンドを挿入するとどうなりますか?
ユーザーがコマンドを実行すると、システムコールが実行されますか?
ユーザーがvi /etc/passwd。 vi /etc/passwd コマンドはカーネルに渡す必要があり、カーネルはユーザー権限を確認し、ファイルの内容を返すか、ユーザーに /etc/passwd に対する権限がある場合に似ています。
答え1
Kusaranandaが指摘したように、問題は難しい問題です。コメントに簡単に入らない高レベルの視点を持つことが役に立ちます。
カーネルはシェルのコマンド処理を直接担当しません。シェル自体はプログラムです。シェルは、ユーザーがコマンドに入力したテキストを解釈し、そのコマンドに基づいて操作を実行します。
Bash、KSH、ZSHなど、Linuxで利用可能なさまざまなシェルがあることを理解することも重要です。したがって、使用するシェルによって、シェルで使用される正確なシステムコールが多少異なる場合があります。
通常、一部のコマンドはシェルに直接組み込まれていますが、実際にはほとんどがPATH
環境変数にリストされているディレクトリにあるプログラムです。これは、多くのコマンドに対してシェルが取るアクションは、他のプログラムを実行することです。これはシステムコールを介して行われます。fork
それからexec
。
例:
vi /etc/passwd
シェルは/etc/passwd
それが何であるかわからず、気にしません。これだけがvi
プログラム(/usr/bin/vi
)ということだけ知っている。 viを実行するにはfork()、exec()を使用し、exec()にパラメータとして「/ etc / passwd」というテキストを渡します。その後呼び出されます。wait
viが完了するまで待ってから戻り値を取得します。
カーネルは文字列 "/etc/passwd"に興味がありません。これはviに渡され、viはそれを開こうとしているファイルとして解釈します。 viは電話を担当しますopen
ファイルを開きます。この段階でのみ、カーネルは現在のユーザーがファイルを開くことができるかどうかをチェックします。
前述のように、使用されている正確なシステムコールは非常に多様であり、Kusalalanandaが指摘したように、この質問はシェルで実行されているすべてのものをリストするのには混乱しすぎます。ただし、デフォルトのfork()exec()wait()は、すべてのプログラムを実行するときの一般的なパターンです。 。