ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:17.50KB ,
资源ID:3487854      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3487854.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(shell命令解释器.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

shell命令解释器.docx

1、shell命令解释器#include #include #include #include #include #include #include char *stack1000=/ ;int num=1;extern char *environ;/* 内装式shell命令的函数声明: */int lsh_cd(char *args);int lsh_help(char *args);int lsh_exit(char *args);int lsh_pushd(char *args);int lsh_popd(char *args);int lsh_dirs(char *args);int ls

2、h_redirect1(char *args);int lsh_redirect2(char *args); int lsh_redirect3(char *args); int lsh_redirect4(char *args);int lsh_export(char *args);int lsh_echo(char *args);/* 装入的命令列表,紧随其后的是相应的功能。 */char *builtin_str = cd, help, exit, pushd, popd, dirs, export, echo;int (*builtin_func) (char *) = &lsh_cd

3、, &lsh_help, &lsh_exit, &lsh_pushd, &lsh_popd, &lsh_dirs, &lsh_export, &lsh_echo;int lsh_num_builtins() return sizeof(builtin_str) / sizeof(char *);/* 安装在内部的函数实现。. */* brief Bultin command: change directory. param args List of args. args0 is cd. args1 is the directory. return Always returns 1, to co

4、ntinue executing. brief Bultin命令:改变目录。 param args参数列表。 args0是“cd”。 args1是目录。 return总是返回1,继续执行。 */int lsh_cd(char *args) if (args1 = NULL) fprintf(stderr, lsh: expected argument to cdn); else if (chdir(args1) != 0) perror(lsh); return 1;/* brief内置命令:打印的帮助。 param args参数列表。 不检查。 return总是返回1,继续执行。 */int

5、 lsh_help(char *args) int i; printf(Type program names and arguments, and hit enter.n); printf(The following are built in:n); for (i = 0; i =0) printf(%s ,stacki); i-; printf(n); return 1;/popd函数:int lsh_popd(char *args) if(num=0) printf(%s ,stacki); i-; printf(n); return 1;/dirs函数:int lsh_dirs(char

6、 *args) if(args1=0) int i=num-1; char m=stacki; stacki=/; while(i=0 ) printf(%s ,stacki); i-; printf(n); stacknum-1=i; return 1; else if(strcmp(args1,-c)=0) /memset(stack,0,sizeof(stack); num=1; if(strcmp(args1,-p)=0)&(strcmp(args2,-v)=0) int j=num-1; while(j=0) printf(%d %s n,num-1-j,stackj); j-; i

7、nt file1,file2;/重定向1:int lsh_redirect1(char *args) file1=open(args2,O_CREAT | O_RDWR); file2=dup(1); dup2(file1,1); close(file1); lsh_launch(args); dup2(file2,1); /close(file2); return 1;/重定向2:int lsh_redirect2(char *args) file1=open(args2,O_CREAT | O_RDWR); file2=dup(2); dup2(file1,2); close(file1)

8、; lsh_launch(args); dup2(file2,2); close(file2); return 1;/重定向3:int lsh_redirect3(char *args) file1=open(args2,O_CREAT | O_RDWR | O_APPEND); file2=dup(1); dup2(file1,1); close(file1); lsh_launch(args); dup2(file2,1); close(file2); return 1;/重定向4:int lsh_redirect4(char *args) file1=open(args2,O_RDONL

9、Y|O_TRUNC); file2=dup(0); dup2(file1,0); close(file1); lsh_launch(args); dup2(file2,0); close(file2); return 1;/export:int lsh_export(char *args) int i=0; int buf100; int *name; int *value1; int *value2; int *value3; if(args1=NULL) while(environi!=NULL) printf(%sn,environi); i+; else strcpy(buf,args

10、1); name= strtok(buf,=); strtok(NULL,:); value1= getenv(name); value2= strtok(NULL,:); value3=strcat(value1,value2); setenv(name,value3,1); return 1;int lsh_echo(char *args) printf(%s:%sn,args1+1,getenv(args1+1); return 1;/* brief启动程序,等待它终止。 param args零终止的参数列表(包括程序)。 return总是返回1,继续执行。 */int lsh_laun

11、ch(char *args) pid_t pid; int status; pid = fork(); if (pid = 0) / Child process if (execvp(args0, args) = -1) perror(lsh); exit(EXIT_FAILURE); else if (pid 0) / Error forking perror(lsh); else / Parent process do waitpid(pid, &status, WUNTRACED); while (!WIFEXITED(status) & !WIFSIGNALED(status); re

12、turn 1;/* brief执行shell内置或启动程序。 param args零终止的参数列表。 return 1如果壳牌公司应该继续运行,如果它应该终止 */int lsh_execute(char *args) int i; /*if(args1 != NULL ) if( strcmp(args2,|)=0) return pipe(args); */ if (args0 = NULL) / An empty command was entered. return 1; for (i = 0; i )=0) return lsh_redirect1(args); if(args1 !

13、= NULL ) if( strcmp(args1,2)=0) return lsh_redirect2(args); if(args1 != NULL ) if( strcmp(args1,)=0) return lsh_redirect3(args); if( strcmp(args0,cat)=0) return lsh_launch(args); if(args1 != NULL ) if( strcmp(args2,= bufsize) bufsize += LSH_RL_BUFSIZE; buffer = realloc(buffer, bufsize); if (!buffer)

14、 fprintf(stderr, lsh: allocation errorn); exit(EXIT_FAILURE); #define LSH_TOK_BUFSIZE 64#define LSH_TOK_DELIM trna/* brief Split a line into tokens (very naively). param line The line. return Null-terminated array of tokens. brief直线分割成令牌(很天真)。 param线。 return以null结尾的标记数组)。brief从stdin读取一行输入。 return从st

15、din。 */char *lsh_split_line(char *line) int bufsize = LSH_TOK_BUFSIZE, position = 0; char *tokens = malloc(bufsize * sizeof(char*); char *token, *tokens_backup; if (!tokens) fprintf(stderr, lsh: allocation errorn); exit(EXIT_FAILURE); token = strtok(line, LSH_TOK_DELIM); while (token != NULL) tokens

16、position = token; position+; if (position = bufsize) bufsize += LSH_TOK_BUFSIZE; tokens_backup = tokens; tokens = realloc(tokens, bufsize * sizeof(char*); if (!tokens) free(tokens_backup); fprintf(stderr, lsh: allocation errorn); exit(EXIT_FAILURE); token = strtok(NULL, LSH_TOK_DELIM); tokenspositio

17、n = NULL; return tokens;/* brief循环输入和执行它。 */void lsh_loop(void) char *line; char *args; int status; char name100; char addr100; do gethostname(name,sizeof(name); printf(:$ ,getlogin(),name, getcwd(addr,sizeof(addr); line = lsh_read_line(); args = lsh_split_line(line); status = lsh_execute(args); fre

18、e(line); free(args); while (status);/* * brief主要入口点。 * param命令行参数个数参数计数。 * param argv参数向量。 * return地位codeLoad配置文件,如果任何。 */int main(int argc, char *argv) / 加载配置文件,如果有的话。 sigset_t sign; sigemptyset(&sign); sigaddset(&sign,SIGQUIT); sigprocmask(SIG_BLOCK,&sign,NULL); void my_handler(int s) printf(Caught signal %dn,s); struct sigaction si; si.sa_handler=my_handler; sigemptyset(&si.sa_mask); si.sa_flags=0; sigaction(SIGINT,&si,NULL); / 运行命令循环。 lsh_loop(); / 执行任何关闭/清理。 sigprocmask(SIG_UNBLOCK,&sign,NULL); return EXIT_SUCCESS;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1