Linux(五)创建一个miniShell

该文介绍了LinuxShell的基本工作原理,包括用户输入命令、命令解析、子进程创建、程序替换(使用execvp)以及父进程的进程等待,以防止僵尸进程的产生。示例代码展示了如何用C语言实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前情提要:掌握进程控制中的进程创建、进程终止、进程等待、进程替换。可以参考下方博文

LInux(四)进程控制(创建、终止、等待、替换)

了解strtok函数的使用

正文:

目录

Shell是什么?

如何进行实现?

        1、用户终端输入命令

        2、程序对输入命令进行解析

        3、创建一个子进程(脏活子进程来做)

        4、子进程内部进行程序替换,让子进程处理对应程序

        5、父进程中进行进程等待,避免产生僵尸进程

 完整源码:


Shell是什么?

根据用户所输入的命令,来进行一系列对应命令名称的对应操作。

如何进行实现?

        1、用户终端输入命令

    9   while(1)
   10   {
   11     printf("[Linux: Shell] $ ");
   12     fflush(stdout);
   13
   14     char cmd[1024] = {0};// 初始化一个cmd数组用来存放输入信息
   15     gets(cmd); 

   16   }

        2、程序对输入命令进行解析

   16     int argc = 0;
   17     char*argv[32] = {NULL};
   18     argv[argc++] = strtok(cmd, " "); // 字符串分割函数,将空格字符全部替换为'\0';
   19     while((argv[argc] = strtok(NULL, " "))!=NULL){
   20         argc++;

   21      }

        3、创建一个子进程(脏活子进程来做)

   25     pid_t child_pid = fork();                                                             
   26     if(child_pid < 0){                                                                    
   27       perror("error fork");
   28       continue;
   29     }else if(child_pid == 0) {子进程}        
                                                 

        4、子进程内部进行程序替换,让子进程处理对应程序

                子进程创建失败就要进行进程终止

   29        }else if(child_pid == 0){                                                                               
   30         //execve、execvp、execv、execl、execlp、execle
   31         //这里选择execvp()  不需要给出环境变量、也不需要指定路径
   32         execvp(argv[0], argv);  // argv第一个参数就保存的命名名
   33         perror("execvp error");                                                                      
   34         exit(0);    // 上方进程替换成功进入新程序,替换失败走到exit(0)

        5、父进程中进行进程等待,避免产生僵尸进程

   36     wait(NULL);   //进行等待任意一个子进程退出

执行结果:

 完整源码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>

int main()
{
  while(1)
  {
    printf("[Linux: Shell] $ ");
    fflush(stdout);
    
    char cmd[1024] = {0};// 初始化一个数组用来存放输入信息
    gets(cmd);
    int argc = 0;
    char*argv[32] = {NULL};     
    argv[argc++] = strtok(cmd, " "); // 字符串分割函数,将空格字符全部替换为'\0';
    while((argv[argc] = strtok(NULL, " "))!=NULL){
        argc++;
    }
    for(int i = 0; argv[i]!=NULL; i++)
      printf("[%s]\n",argv[i]);    //显示输入信息
    
    pid_t child_pid = fork();
    if(child_pid < 0){
      perror("error fork");
      continue;
    }else if(child_pid == 0){
        //execve、execvp、execv、execl、execlp、execle
        //这里选择execvp()  不需要给出环境变量、也不需要指定路径
        execvp(argv[0], argv);
        perror("execvp error");
        exit(0);    // 上方进程替换成功进入新程序,替换失败走到exit(0)
    }
    wait(NULL); // 进行等待任意一个子进程退出
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值