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){//childexecvp(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