实现带参数的简单shell(unix操作系统系)
来源:互联网 发布:java经典编程50 编辑:程序博客网 时间:2024/06/04 19:59
实现带参数的简单shell
调用系统函数:
int execve(const char *path, const char *argv[],const char *envp[]);
函数说明:
path:要执行的程序路径名,比如“/bin/ls”,“cd”,“/usr/bin/gcc”等等。
argv:参数表,比如ls命令中可带的命令行参数-l,-a等。注意,argv的第一个元素必须是要执行的程序(命令)的路径名。
envp:环境变量表,供要执行的命令使用。实参数用NULL或系统环境变量environ均可。
注意,因为environ由系统提供,属于外部变量,所以说明时必须用“extern”修饰。
实例:
char *argv[] = {“gcc”, “-g”, “-c”, “hello.c”, NULL};execve(“/usr/bin/gcc”, argv, environ); // 编译程序“hello.c”
说明(使用到的文件):
Apue.h 为头文件 。
Error2e.c 为错误处理。
Shell2.c 为源文件。
Shell2 可执行文件。
#include "apue.h"#include <sys/wait.h>#include "string.h"static void sig_int(int); /* our signal-catching function */intmain(void){ char buf[MAXLINE]; /* from apue.h */ pid_t pid; int status; //my write char* argv[MAXLINE]; int len=0; int j=1; int i=0; if (signal(SIGINT, sig_int) == SIG_ERR) err_sys("signal error"); printf("%% "); /* print prompt (printf requires %% to print %) */ while (fgets(buf, MAXLINE, stdin) != NULL) { if(buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]='\0'; //my write /*for(i=0;i<10;i++) { argv[i]=NULL; }*/ len=strlen(buf); for(i=0;i<len;i++) if(buf[i]==' ') buf[i]='\0'; argv[0]=buf; for(i=0;i<len;i++) { if(buf[i]=='\0') argv[j++]=&buf[i+1]; } argv[j]=NULL; j=1; //end/* if (buf[strlen(buf) - 1] == '\n') buf[strlen(buf) - 1] = 0; */ /* replace newline with null */ if ((pid = fork()) < 0) { err_sys("fork error"); } else if (pid == 0) { /* child */ //my write printf("now len:%d agrv[n]:0:%s 1:%s 2:%s 3 %s 4 %s 5 %s ",len,argv[0],argv[1],argv[2],argv[3],argv[4],argv[5]); execve(argv[0], argv, NULL); err_ret("couldn't execute: %s", buf); exit(127); } /* parent */ if ((pid = waitpid(pid, &status, 0)) < 0) err_sys("waitpid error"); printf("%% "); } exit(0);}voidsig_int(int signo){ printf("interrupt\n%% ");}
运行结果:
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 实现带参数的简单shell(unix操作系统系)
- 实现带参数的简单shell(unix操作系统系)--1
- UNIX程序设计实验一:实现带参数的简单的shell
- unix shell(壳)的简单实现
- 实验一 实现带参数的简单shell
- shell脚本实现带参数
- shell脚本里实现带参数函数的方法
- 操作系统上机——实现一个简单的shell
- unix操作系统公约:关于负数的参数
- 简单c语言实现unix shell【转载】
- unix shell if 参数
- 编制模拟“五个哲学家”问题的线程实现(unix操作系统系)---6
- 一个带参数的Shell的例子
- unix shell 脚本 (最简单的一个)
- UNIX操作系统中Shell程序设计
- shell函数传递带空格的参数
- Hadoop基于Shell命令与底层Unix操作系统的交互
- Hadoop基于Shell命令与底层Unix操作系统的交互
- 构建大型网站(百万级访问量)的技术准备
- 改变 Word正文 底色
- 每天一个linux命令(34):du 命令
- C++拷贝构造函数详解
- Linux下core文件的演示分析
- 实现带参数的简单shell(unix操作系统系)
- 离散傅里叶变换的学习与思考
- Java 数三退一
- 在Ubuntu下使用Apt-Get安装Google Chrome(非Chromium)
- HTTP协议详解(真的很经典)
- 获取外网IP并发送到指定邮箱的vbs代码[已测]
- shell编程检测监控mysql的CPU占用率
- 《一个操作系统的实现》(一):不到20行的操作系统代码的解释
- (转载)总结SWT的几点不足