Linux -minishell程序

我们在终端中运行一个程序, 这个程序的父进程实际上是shell程序
当我们在shell中输入了一个命令, 这时候其实shell对这个标准输入进行解析, 得到了程序名称. 然后创建子进程, 并且将子进程的程序替换为当前这个解析出来的程序

今天, 我们要实现一个minishell程序, 步骤如下:

1.等待标准输入获取命令行  fgets()-从标准输入读取一行数据
2.获取到标准输入之后,进行字符串解析,得到命令名称以及运行参数
3.创建子进程            fork()
4.子进程中进行程序替换,运行指定的命令  execvp()-程序替换(不用指定程序路径)
5.父进程进程等待,等待子进程命令执行完毕  wait()-避免僵尸进程
代码如下:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    while(1)
    {
    //1.等待标准输入
    char buf[1024] = {0};
    printf("  minishell @@:%s", buf);
    fgets(buf, 1023, stdin);
    buf[strlen(buf)-1] = '\0';
    //2.对输入数据进行解析 
    char* argv[32] = {NULL};
    int argc = 0;
    char* ptr = buf;
    // [   ls   -a    -l   ]
    while(*ptr != '\0')
    {
        if(*ptr != ' ')
        {
           argv[argc] = ptr;
           argc++;
           while(*ptr != ' ' && *ptr != '\0')
           {
              ptr++;
           }
           *ptr = '\0';
       }
       ptr++;
    }
    argv[argc] = NULL;  //最后一个参数的下一个位置置NULL
    //3.创建子进程
    pid_t pid = fork();
    //4.在子进程中程序替换
    if(pid == 0)
    {
       execvp(argv[0], (char**)argv);   //程序替换成功就去运行新程序,失败则打印错误
       perror("execvp failed");  //打印上一次系统调用接口使用错误的原因
       exit(0);
    }
    //5.进程等待
    wait(NULL);
    return 0;
    }
}
运行结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值