C实现linux下自己的shell

strcmp函数

       char *strsep(char **stringp, const char *delim);

strsep 是 C 标准库字符串实用程序的一部分,定义在 <string.h> 头文件中。它可以用来从字符串对象中提取被给定定界符包围的标记。

strsep 需要两个参数-指向 char*的指针和指向 char 的指针。第一个参数用于传递需要搜索的字符字符串的地址。第二个参数指定了一组定界符,用来标记提取的标记的开始和结束。请注意,在提取的标记字符串中,定界符会被丢弃。当找到第一个标记时,第一个参数被修改为存储指向下一个定界符的指针。

glob函数

       glob函数搜索匹配 函数pattern中的参数,如/*是匹配根文件下的所有文件(不包括隐藏文件,要找的隐藏文件需要从新匹配),然后会将匹配出的结果存放到 pglob,即第4个参数中,第二个参数能选择匹配模式,如是否排序,或者在函数第二次调用时,是否将匹配的内容追加到pglob中,等,第3个参数是查看错误信息用,一般置为NULL;

GLOB_NOCHECK:如果没有匹配到,则返回命令本身。

GLOB_APPEND:将结果追加。

实现自己的shell

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



#define DELIMS " \t\n"
struct cmd_st
{
    glob_t globres;
};

void prompt()
{
    printf("mysh-0.1$ ");
}
void parse( char *line,struct cmd_st *cmd)
{
    char *tok;
    int i=0;

    while(1)
    {
    tok = strsep(&line,DELIMS);
    if(tok == NULL)
        break;
    if(tok[0] == '\0')
        continue;

    glob(tok,GLOB_NOCHECK|GLOB_APPEND*i,NULL,&cmd->globres);
    i = 1;
    }
    
}

int main()
{

    int pid;

    while(1)
    {
        char *line = NULL;
        size_t linesize = 0;
    
        struct cmd_st cmd;
        prompt();

        if(getline(&line,&linesize,stdin)<0)
        {
            break;
        }
        
        parse(line,&cmd);

        if(0)
        {
            //内部命令
            printf("do sth\n");
        }
        else
        {
            //外部命令
            pid = fork();
            if(pid <0)
            {
                perror("fork");
                exit(1);
            }
            if(pid ==0)
            {
                //child
                execvp(cmd.globres.gl_pathv[0],cmd.globres.gl_pathv);
                perror("execvp");
                exit(1);
            }
            else
            {
                wait(NULL);
            }
        }
    }

    return 0;
}

用root用户创建一个用户叫做:john

useradd -m john 创建用户

passwd john  修改密码

cp mysh /usr/local/bin/mysh

vi /etc/passwd修改登录的shell

su john即可切换到自己的shell

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值