ステップバイステップの思考分析:
1.ユーザーのキーボード入力
をキャプチャするscanf、getsなどの関数を使用して、ユーザー入力情報を取得します
2.入力情報を解析します-コマンド名と操作パラメーターを取得します。
取得した上位の入力情報を解析し、すべてのスペース、キャリッジリターン、タブなどを無視し、入力文字列のみを考慮します。
[ls-a-を入力した場合l]、取得する必要があるのは、3つの重要な情報 "ls" "-a" "-l"です。
3.子プロセスを作成し、プログラムを子プロセスのコマンド名に置き換えます(子プロセスにコマンドを実行させ
ます)。fork()を使用して子プロセスを作成し、プログラム置換関数(execvpなど)を使用します。 )子プロセスでプログラムを置換します。取得したls、-a、-lなどの情報をプログラム置換関数に渡し、子プロセスに関連する関数を実行させます。
4.プロセスは、子プロセスが終了するのを待機して待機し、ゾンビプロセスを防止します。
待機(NULL)を使用して、子プロセスが終了するのを待機し、ゾンビプロセスの表示とリソースリークを防止します。
完全なコード:
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>
#include<ctype.h>
int main()
{
while (1)
{
printf("dev用户输入:");
fflush(stdout);
char cmd[1024] = {
0 };
fgets(cmd, 1023, stdin);//获取键盘输入的信息
cmd[strlen(cmd) - 1] = '\0';
printf("cmd:[%s]\n", cmd);
char* ptr = cmd;
char* arg[32] = {
NULL };
int my_argc = 0;
//解析获取到的信息--得到命令名称和运行参数
while (*ptr != '\0')
{
if (!isspace(*ptr))
{
arg[my_argc] = ptr;
my_argc++;
while (*ptr != '\0' && !isspace(*ptr))
{
ptr++;
}
}
* ptr = '\0';
}
ptr++;
}
arg[my_argc] = NULL;
pid_t pid = fork();
//创建子进程--进行程序替换
if (pid < 0)
{
perror("fork error:");
continue;
}
else if (pid == 0)
{
//程序替换
execvp(arg[0], arg);
exit(-1);
}
wait(NULL);
return 0;
}