[关闭]
@1405010312 2016-04-27T14:41:42.000000Z 字数 2392 阅读 617

实现一个简单的shell

linux进程管理

报告提交日期:2016.4.27          报告截止日期:2016.4.28
姓名:肖罗罗     学号:1405010312     班级:计算机三班


一.实验题目

  • 实现一个简单的shell

二.实验目的

  • 通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程和程序之间的区别

三.实验平台

virtualbox下的linux mint17.3的虚拟环境

四.实验要求

  1. 独立完成作业
  2. 达到题目要求的几点

五.背景知识

    1. 在 Linux 中创建子进程要使用 fork()函数,执行新的命令要使用 exec()系列函数,等待子进 程结束使用 wait()函数,结束终止进程使用 exit()函数。
    2.fork 建立一个子进程,父进程继续运行,子进程在同样的位置执行同样的程序。对于父进程, fork()返回子进程的 pid, 对于子进程,fork()返回 0。出错时返回-1。
    3.exec 系列有 6 个函数,原型如下:
1. int execl( const char *path, const char *arg, ...);
2. int execlp( const char *file, const char *arg, ...);
3. int execle( const char *path, const char *arg , ..., char * const envp[]);
4. int execv( const char *path, char *const argv[]);
5. int execve (const char *filename, char *const argv [], char *const envp[]);
6. int execvp( const char *file, char *const argv[]);

六.实验流程

1.创建shell.c文件

2.将代码1-1复制到其中

3.编译 gcc -o shell shell.c

1

4.运行 ./shell

5.验证cd cd qq

2

6.验证environ

3

7.验证echo

4

8.验证help

5

9.验证jobs

6

10.验证quit,exit,bye

7

七.实验体会

八.程序清单

代码1-1

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<wait.h>
  4. #include<sys/types.h>
  5. #include<error.h>
  6. #include<errno.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #include<pwd.h>
  10. const int maxn = 150;
  11. int num;
  12. char* p;
  13. void setup(char op[], char *argv[]){
  14. int i, j;
  15. i = 0;
  16. for(p = op; ;p++){
  17. argv[i++] = p;
  18. while(*p != ' ' && *p != '\0') p++;
  19. if(*p == '\0') break;
  20. *p = '\0';
  21. }
  22. num = i;
  23. argv[i] = NULL;
  24. }
  25. void showhelp(){
  26. printf("help\n");
  27. printf("cd<目录> : 更该当前目录到其他<目录>\n");
  28. printf("echo<内容> : 复制内容\n");
  29. printf("help : shell的使用方法和基本功能\n");
  30. printf("jobs : 输出shell当前一系列子进程\n");
  31. printf("quit,exit,bye : 退出shell\n");
  32. }
  33. void showecho(char* argv[]){
  34. int i;
  35. for(i = 1; i < num; i++){
  36. printf("%s", argv[i]);
  37. if(i != num-1) printf(" ");
  38. }
  39. printf("\n");
  40. }
  41. void showjobs(char* argv[]){
  42. if(fork() == 0){
  43. if(execlp("ps", "-1", NULL) == -1)
  44. fprintf(stderr, "exec %s failed: %s\n", argv[0], strerror(errno));
  45. exit(1);
  46. }
  47. }
  48. int main(){
  49. char op[maxn];
  50. char *argv[maxn/2-1];
  51. while(1){
  52. gets(op);
  53. setup(op, argv);
  54. if(num == 0) continue;
  55. if(!strcmp(argv[0],"quit") || !strcmp(argv[0],"exit") || !strcmp(argv[0],"bye")) break;
  56. if(!strcmp(argv[0], "help")){showhelp(); continue;}
  57. if(!strcmp(argv[0], "echo")){showecho(argv); continue;}
  58. if(!strcmp(argv[0], "cd")){chdir(argv[1]); continue;}
  59. if(!strcmp(argv[0], "jobs")){showjobs(argv); wait(NULL); continue;}
  60. if(!strcmp(argv[0], "environ")) argv[0] = "env";
  61. if(fork() == 0){
  62. if(execvp(argv[0], argv) == -1)
  63. fprintf(stderr, "exec %s failed: %s\n", argv[0], strerror(errno));
  64. exit(1);
  65. }
  66. wait(NULL);
  67. }
  68. return 0;
  69. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注