自主myshell的编写

shell执行过程:

1.读取用户从键盘输入的命令(调用read函数);

2.分析命令,以命令名为文件名,并将其他参数改造为系统调用execvp()参数处理所要求的格式;

3.终端进程(shell)调用fork()或者vfork()建立一个子进程;

4.子进程依据文件名(命令名)到目录中查找有关文件,将他调入内存,并创建新的文本段,并根据写时拷贝的方式创建相应的数据段,堆栈段;

5当子进程完成处理或者出现异常后,通过调用exit()函数向父进程报告;

6.终端进程调用wait()函数等待子进程完成,并对子进程进行回收。

注: 目前不支持 管道 重定向 等功能
#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>

int main()
{
        //初始化数组
        char buf[1024] = { 0 };
        while(1)
        {
        printf("[myshell]$ ");
        fflush(stdout);  //刷新
        size_t s = read( 0, buf, sizeof( buf )- 1);  //从键盘读入字符串
        if(s > 0)
        {          //读取成功
            buf[s - 1] = '\0';     //字符串加\0表示结尾
        }
        else
        {
            perror("read"); //读取失败
            return 1;
        }
        char* argv[32];
        argv[0] = buf;
        char* start = buf;
        int i = 1;
        while(*start)
        {
            if(*start == ' ')   //如果从空格开始到字符串
            {
                *start = '\0';     //加上\0作为结束
                start ++;          //从下一个字符开始
                argv[i++] = start;
            }
            else   //  从字符串开始到空格
            {
                start ++; 
            }
        }
        argv[i] = NULL;
            pid_t pid;
            pid = fork();
            if(pid < 0)   //创建进程失败
            {
                perror("fork");
                exit(1);
            }
            if(pid == 0)    //子进程
            {
                execvp(argv[0], argv); //查找符合命令的参数执行该文件,                                    
                return 2 ;
            }
            else if(pid > 0)   //父进程
            {
                int st = 0;
                wait(&st);    //等待子进程的退出码
            }
    }
    return 0;
}

这里写图片描述

好的,我可以为您提供一些基本的思路和参考代码。 首先,您需要了解一些基本的 shell 命令和操作符,如 cd、ls、echo、管道符、重定向等。 然后,您可以按照以下步骤编写您的 myshell: 1. 读取用户输入的命令。可以使用 fgets 函数来读取用户输入的命令。 2. 解析用户输入的命令。将用户输入的命令按照空格分割成若干个参数,并判断是否存在管道符或重定向符号等特殊操作符。 3. 根据用户输入的命令,执行相应的操作。可以使用 exec 系列函数来执行命令,使用 fork 函数来创建子进程进行执行。 4. 等待子进程执行完毕,并输出执行结果。 下面是一个简单的 myshell 程序的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #define MAX_CMD_LEN 1024 int main() { char cmd[MAX_CMD_LEN]; while (1) { printf("myshell> "); fgets(cmd, MAX_CMD_LEN, stdin); cmd[strlen(cmd) - 1] = '\0'; // 去掉换行符 if (strcmp(cmd, "exit") == 0) { break; } int pid = fork(); if (pid == -1) { perror("fork"); exit(1); } else if (pid == 0) { char *argv[MAX_CMD_LEN], *token; int argc = 0; token = strtok(cmd, " "); while (token != NULL) { argv[argc++] = token; token = strtok(NULL, " "); } argv[argc] = NULL; execvp(argv[0], argv); perror("execvp"); exit(1); } else { int status; waitpid(pid, &status, 0); } } return 0; } ``` 当用户输入 exit 命令时,程序会退出。如果用户输入其他命令,则会创建子进程执行该命令,并等待子进程结束。在子进程中,首先将用户输入的命令解析成若干个参数,然后调用 execvp 函数执行该命令。如果 execvp 函数返回,则说明执行失败,程序会输出错误信息并退出。 希望这个示例代码能够帮到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值