分步思路解析:
1、捕捉用户键盘输入
使用例如scanf,gets等函数获取用户输入信息即可
2、解析输入的信息–得到命令名称和运行参数
解析获取到的上输入信息,将空格,回车,制表符等等全部忽略,只关心输入的字符串等
假如输入[ ls -a -l ],我们需要获取到的就是 “ls” " -a" " -l"这三个关键信息
3、创建子进程,给子进程通过命令名称进行还程序替换(让子进程来执行命令)
使用fork()创建子进程,然后再子进程中使用程序替换函数(execvp等等)进行程序替换,将获取到的如ls、-a、-l等信息传递给程序替换函数,让子进程来执行相关功能。
4、进程等待,等待子进程退出,防止出现僵尸进程
使用wait(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;
}