linux环境下使用c语言实现shell(一)
2017-04-22 12:10
302 查看
操作系统上机作业.
sh1.c: 实现shell程序,要求具备如下功能
–支持命令参数
$echo arg1 arg2 arg3
$ls /bin /usr/bin /home
–实现内置命令cd、pwd、exit
$cd /bin
$pwd
/bin
eval函数中有两个外调函数就是parseline,解析命令行cmdstring,储存到argv数组中.bulidin_command函数判断命令是否是内置命令,如果是,则执行.不是则返回false.
其中关于exec系列函数的讲解请参照这篇博文.
最后实现的结果:
这只是操作系统的一次上机作业,之后应该还要继续补充…功能在完善…
———————————–2017.4.22
sh1.c: 实现shell程序,要求具备如下功能
–支持命令参数
$echo arg1 arg2 arg3
$ls /bin /usr/bin /home
–实现内置命令cd、pwd、exit
$cd /bin
$pwd
/bin
整体框架
一个死循环,一直在等待这用户输入命令.主要的工作都在eval这个函数里面.int main(int argc,char *argv[]){ char cmdstring[MAX_CMD]; int n; while(1){ printf("*myshell*>"); fflush(stdout); /*read*/ if((n=read(0,cmdstring,MAX_CMD))<0){ printf("read error"); } eval(cmdstring); } return 0; }
eval函数实现
unix中命令分为内置命令和外置命令,内置命令不需要开进程就可以直接执行,比如cd,pwd.外置命令需要重开个进程才能执行,比如vim,/bin/ls,/bin/echo.eval函数中有两个外调函数就是parseline,解析命令行cmdstring,储存到argv数组中.bulidin_command函数判断命令是否是内置命令,如果是,则执行.不是则返回false.
void eval(char *cmdstring){ /*parse the cmdstring to argv*/ char *argv[MAX_CMD]; /*Holds modified command line*/ char buf[MAX_CMD]; strcpy(buf,cmdstring); /*parse the cmdstring*/ parseline(buf,argv); if(argv[0]==NULL){ return;/*ignore empty lines*/ } /*is a buildin command*/ /*direct return*/ if(buildin_command(argv)) return; int pid = fork(); if(pid == 0){ if(execvp(argv[0],argv)<0){ printf("%s:command not found.\n",argv[0]); exit(0); } } wait(pid); }
其中关于exec系列函数的讲解请参照这篇博文.
parseline函数实现
就是一个字符串操作,根据空格分割,写的比较屎.读者可以自己实现,不需要模仿我的.记得最后的argv数组要以NULL结尾.int parseline(char *buf,char**argv){ while(*buf==' '){ buf++; } int delim = 0; int argc = 0; while(*buf!='\n'){ while(buf[delim]!='\n'&&buf[delim]!=' '){ delim++; } if(buf[delim] == '\n'){ buf[delim] = '\0'; argv[argc++] = buf; break; } buf[delim] = '\0'; argv[argc++] = buf; buf+=delim+1; /*指示器indicator=0*/ delim = 0; while(*buf==' '){ buf++; } } /*the last element is NULL*/ argv[argc] = NULL; return 0; }
buildin_command函数实现
题目要求的几个内置命令,也就实现了这几个内置命令.关于getcwd和chdir的使用可以自行百度.int buildin_command(char **argv){ if(strcmp(argv[0],"exit")==0){ exit(0); } if(strcmp(argv[0],"cd")==0){ if(chdir(argv[1])){ printf("myselous:cd:%s:no such directory\n",argv[1]); } return 1; } if(strcmp(argv[0],"pwd")==0){ char buf[MAX_DIR_NAME]; printf("%s\n",getcwd(buf,sizeof(buf))); return 1; } return 0;//not a buildin_command }
最后实现的结果:
这只是操作系统的一次上机作业,之后应该还要继续补充…功能在完善…
———————————–2017.4.22
相关文章推荐
- Linux下使用SSH和VNC实现图形化远程控制(Ubuntu 9.04环境)
- Linux使用Shell脚本实现ftp的自动上传下载
- 在linux下使用c语言实现ARP欺骗
- 编译链接------Linux环境下c语言静态链接库和动态链接库创建和使用
- Linux环境下c语言静态链接库和动态链接库创建和使用
- linux下GCC编译环境中二叉树遍历、C语言实现以及调试过程中段错误
- Linux使用Shell脚本实现ftp的自动上传下载
- Linux中使用shell+python实现监控系统负载+邮件报警
- Linux下使用Shell脚本实现ftp的自动上传下载的代码小结
- C语言+shell 实现linux网卡状态检测
- 利用linux下的c语言编程来简单的实现一个shell功能实现!
- Windows环境是使用C语言计算程序或算法执行时间的不同粒度实现
- Linux环境下C语言实现贪吃蛇游戏
- 使用c语言设置linux系统环境变量实例
- linux下使用Freetds 连接MS SqlServer 2000 (C语言实现)
- linux脚本发送邮件 shell发送邮件(使用 msmtp+mutt+shell来实现)
- Linux下C语言实现简单Shell
- Linux环境下C语言实现报数游戏
- Linux环境下c语言静态链接库和动态链接库创建和使用
- Linux使用Shell脚本实现ftp的自动上传下载