バックグラウンド
Linuxでは、このようなさまざまなコマンドを入力することがよくあります。
しかし、最下層が実行をどのように認識するかを知っていますか?
前書き
次の図の時間軸を使用して、イベントのシーケンスを示します。時間は左から右です。シェルはshというラベルの付いた正方形で表され、時間の経過とともに左から右に移動します。シェルは、ユーザーから文字列「ls」を読み取ります。シェルは新しいプロセスを作成し、そのプロセスでlsプログラムを実行して、プロセスが終了するのを待ちます。
シェルは入力行を読み取り、新しいプロセスを作成し、このプロセスでプログラムを実行して、プロセスが終了するのを待ちます。したがって、シェルを作成するには、次のプログラムをループする必要があります。
1.コマンドラインを取得します
2.コマンドラインを解析します
3.子プロセス(フォーク)を作成します
4.子プロセス(execvp)を置き換えます
5.親プロセスは、子プロセスが終了するのを待ちます(待機)。
コード
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/wait.h>
int main()
{
char cmd[256];
const char *cmd_line = "[anton@VM-centos]#";
while(1)
{
cmd[0]=0;
printf("%s",cmd_line);
fgets(cmd,256,stdin);
cmd[strlen(cmd)-1]='\0';
char *args[16];
args[0]=strtok(cmd," ");
int i=1;
do{
args[i]=strtok(NULL," ");
if(args[i]==NULL)
{
break;
}
i++;
}while(1);
pid_t id=fork();
if(id<0)
{
perror("fork error\n");
}
if(id==0)
{
execvp(args[0],args);
exit(1);
}
else if(id>0)
{
wait(NULL);
}
}
return 0;
}
結果が表示されます。
機能とプロセス
exec / exitは、call / returnに似ています
。Cプログラムは、多くの関数で構成されています。関数は、別の関数を呼び出し、同時にいくつかのパラメーターをその関数に渡すことができます。呼び出された関数は特定の操作を実行してから、値を返します。各関数にはローカル変数があり、さまざまな関数が呼び出し/戻りシステムを介して通信します。パラメータと戻り値を介して関数間でプライベートデータと通信するこのモードは、構造化プログラミングの基礎です。Linuxは、プログラム内からプログラム間へのこのモデルの拡張を推奨しています。次の図に示すように
、Cプログラムは別のプログラムをフォーク/実行して、いくつかのパラメーターをそのプログラムに渡すことができます。呼び出されたプログラムは特定の操作を実行し、exit(n)を介して値を返します。それを呼び出すプロセスは、待機(&ret)を介してexitの戻り値を取得できます。