• sh1.c: 实现shell程序,要求具备如下功能
  • 支持命令参数
$ echo arg1 arg2 arg3
$ ls /bin /usr/bin /home
  • 实现内置命令cd、pwd、exit
$ cd /bin
$ pwd
/bin

实现思路:在获取命令字符串后,用strtok函数对字符串进行处理,获取参数列表,然后判断命令是内部命令还是外部命令,进行分别处理。

1、内部命令的实现:内部命令全部自己实现,exit通过myexit()函数实现,myexit()直接调用exit(0)cd通过mycd()函数调用chdir()函数来实现,pwd通过mypwd()函数调用getcdw()函数实现。

2、外部命令的实现:外部命令通过在cmd函数中创建子进程,在子进程通过execvp()函数装载外部命令实现。
实现代码:

#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
#include<pwd.h>#define MAX_PATH_LEN 200
#define CMD_LEN 200
int cmd_num;
char *cmd_array[100];void cmd(){pid_t pid;pid=fork();if(pid==0){if(execvp(cmd_array[0],cmd_array)<0){printf("Error:command not found\n");}}wait(NULL);
}void print_user(){struct passwd *pwd;char path_name[MAX_PATH_LEN];getcwd(path_name,MAX_PATH_LEN);pwd=getpwuid(getuid());printf("%s@kali:%s$ ",pwd->pw_name,path_name);
}void get_cmd(){int i=0;char str[CMD_LEN];char *buf;cmd_num=0;memset(cmd_array,0,100);fgets(str,CMD_LEN,stdin);buf=strtok(str," \n");while(buf!=NULL){cmd_array[i]=(char *)malloc(sizeof(*buf));strcpy(cmd_array[i++],buf);buf=strtok(NULL," \n");}cmd_array[i]=NULL;cmd_num=i;
}void mycd(){struct passwd *pwd;char path_name[MAX_PATH_LEN];pwd=getpwuid(getuid());if(cmd_num==1){strcpy(path_name,pwd->pw_dir);if(chdir(path_name)==-1){perror("mycd:chdir..");exit(1);}}else{if(chdir(cmd_array[1])==-1){printf("mycd: cd:%s:No such directory\n",cmd_array[1]);}}
}void myexit(){exit(0);
}void mypwd(){char path_name[MAX_PATH_LEN];if(getcwd(path_name,MAX_PATH_LEN)){printf("%s\n",path_name);}else{perror("Error:getcwd...\n");exit(0);}
}int main(){while(1){print_user();get_cmd();if(cmd_array[0]==NULL)return 0;else if(strcmp(cmd_array[0],"exit")==0)myexit();else if(strcmp(cmd_array[0],"pwd")==0)mypwd();else if(strcmp(cmd_array[0],"cd")==0)mycd();else cmd();}return 0;
}

运行结果

欢迎留言交流。。。。

操作系统上机作业--实现shell(1)(多进程)相关推荐

  1. 操作系统上机作业--实现shell(2)(多进程)

    sh2.c: 实现shell程序,要求在第1版的基础上,添加如下功能 • 实现文件重定向 • $ echo hello >log • $ cat log • Hello 实现思路: 和sh1.c ...

  2. 操作系统上机作业--实现mysys(多进程)

    mysys.c: 实现函数mysys,用于执行一个系统命令,要求如下 mysys的功能与系统函数system相同,要求用进程管理相关系统调用自己实现一遍 使用fork/exec/wait系统调用实现m ...

  3. 操作系统上机作业--创建N个线程(多线程)

    ring.c: 创建N个线程,它们构成一个环 • 创建N个线程:T1.T2.T3.- TN • T1向T2发送整数1 • T2收到后将整数加1 • T2向T3发送整数2 • T3收到后将整数加1 • ...

  4. 操作系统上机作业-- 使用信号量解决生产者、计算者、消费者问题(多线程)

    pc2.c: 使用信号量解决生产者.计算者.消费者问题 • 功能和前面的实验相同,使用信号量解决 实现思路: 生产者.计算者.消费者三者之间的关系和上一个编程任务一样,不一样的是,将互斥量.条件变量封 ...

  5. 操作系统上机作业--使用条件变量解决生产者、计算者、消费者问题(多线程)

    pc1.c: 使用条件变量解决生产者.计算者.消费者问题 /* • 系统中有3个线程:生产者.计算者.消费者 • 系统中有2个容量为4的缓冲区:buffer1.buffer2 • 生产者生产'a'.' ...

  6. 操作系统上机作业--多线程排序

    sort.c: 多线程排序 • 主线程创建一个辅助线程 • 主线程使用选择排序算法对数组的前半部分排序 • 辅助线程使用选择排序算法对数组的后半部分排序 • 主线程等待辅助线程运行結束后,使用归并排序 ...

  7. 操作系统上机作业--根据莱布尼兹级数计算PI(2)(多线程)

    pi2.c: 使用N个线程根据莱布尼兹级数计算PI • 与上一题类似,但本题更加通用化,能适应N个核心,需要使用线程参数来实现 • 主线程创建N个辅助线程 • 每个辅助线程计算一部分任务,并将结果返回 ...

  8. 操作系统上机作业--根据莱布尼兹级数计算PI(1)(多线程)

    pi1.c: 使用2个线程根据莱布尼兹级数计算PI • 莱布尼兹级数公式: 1 - 1/3 + 1/5 - 1/7 + 1/9 - ... = PI/4 • 主线程创建1个辅助线程 • 主线程计算级数 ...

  9. 操作系统上机作业--使用系统调用实现mycp

    mycp.c的功能与系统cp程序相同 将源文件复制到目标文件,例子如下: 要求使用系统调用open/read/write/close实现 $ cat /etc/passwd root:x:0:0:ro ...

最新文章

  1. Android 如何做一次内存泄漏大排查
  2. IDEA启动Tomcat AJP连接器配置secretRequired=“true“,但是属性secret确实空或者空字符串,这样的组合是无效的解决办法
  3. 2021年,Web前端还好找工作吗?
  4. 一步一步学EF系列【6、IOC 之AutoFac】
  5. android 巧用资源文件(不断积累)
  6. 数据库原理与应用 基于SQL Server 2005pdf
  7. matplotlib可视化学习笔记
  8. 关于中断是否可以套嵌?
  9. KeyShot中该怎么添加反射地平面
  10. 自动更改IP地址反爬虫封锁
  11. CSS 框架 Bulma 教程
  12. 利用C51单片机内部函数_corl_函数实现LED流水灯。
  13. migo获利能力段增加新字段
  14. AssetBundle异步加载资源阻塞主线程的疑问
  15. 吉林大学计算机学院林丛郁,吉林大学珠海学院201奖学金
  16. 简述MySQL分区表类型
  17. eclipse修改java jdk(以1.8为例)
  18. linux进程状态详解
  19. 纯无趣技术贴,关于色深、位深、图像深度详解
  20. 什么样的企业会上BI系统?

热门文章

  1. 创建一个带参数的formgoup_gin框架如何获取带文件的formData请求?
  2. 小白自学前端,轻松月入过万哦!
  3. linux共享磁盘给指定ip,linux想挂载通过ipsan协议推送上来的磁盘,两个ip共分配了21个未分区的盘,...
  4. oracle存储过程与函数的区别及作用,Oracle存储过程与存储函数-入门
  5. 博客园CodingLife模板样式优化
  6. 关于IE6.7.8.FF兼容的问题
  7. 并发编程-concurrent指南-阻塞队列BlockingQueue
  8. CentOS7 安装NodeJS
  9. perl6正则 4: before / after 代码断言: ?{} / !{}
  10. C#反射Assembly 具体说明