[Linux]模拟实现shell:命令行解释器

分步思路解析:

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43962381/article/details/115141007