Linux简易Shell源码
Shell
Shell是系统的⽤户界⾯,提供了⽤户与内核进⾏交互操作的⼀种接⼝。它接收⽤户输⼊的命令并把它送⼊内核去执⾏ 实际上Shell是⼀个命令解释器,它解释由⽤户输⼊的命令并且把它们送到内核
Linux系统中的shell程序最常见的是BASH,可以使⽤以下⼏种⽅法查看当前⽤户使⽤的Shell
echo $SHELL
env | grep SHELL
错误的输⼊⼀条命令查看错误提⽰
代码
话不多说,上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
//命令⾏命令最多有⼋个参数
char *argv[8];
int argc = 0;
//命令⾏参数处理
void do_pares(char* buf)
{
int i = 0;
/
/status=1 标志⼀个参数字符串还没有结束
//status-0 标志当前命令⾏字符为空格
int status = 0;
for( i; buf[i]; i++)
{
//将buf中第⼀个字符地址给 argv[argc++],然后status置位,直到遇到空格后的下个参数,再将其字符起始地址赋给 argv[]
if(!isspace(buf[i])&&status == 0)
{
argv[argc++] = buf+i;
status = 1;
}
else if(isspace(buf[i]))
{
status = 0;
buf[i] = 0;
}
}
argv[argc] = NULL;
}
void do_execute()
{
pid_t pid = fork();
switch(pid)
switch(pid)
{
//⼦进程创建失败
case -1:
perror("fork");
exit(EXIT_FAILURE);
break;
//⼦进程替换,fork()给⼦进程返回0
case0:
//数组形式参数,⾃动检索环境变量
execvp(argv[0], argv);
//进程替换成功不返回,直接从替换进程处结束,如果运⾏到这⾥,说明进程替换失败,打印提⽰信息 perror("execvp");
exit(EXIT_FAILURE);
//⽗进程
default:
{
int st;
//阻塞等待⼦进程
while(wait(&st) != pid);
}
}
}
int main(void)
{
char buf[1024] = {};
while(1)
{
printf("[myshell]@");
scanf("%[^\n]%*c",buf);
do_pares(buf);
do_execute();
}
return0;
linux重定向}
程序中还是有很多bug,⼀些外部命令,管道操作,输⼊输出重定向还没有实现,请⼤家多多提出宝贵意见,共同进步
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论