my_shell
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<pwd.h>
#include<limits.h>
#include<bits/local_lim.h>
int main(int argc, const char *argv[])
{
while(1){
int i=0,j=0,p=0;
char buf[100]={0}; //存储命令
char host[HOST_NAME_MAX]={0}; //存储主机名
gethostname(host,sizeof(host));
uid_t uid=getuid(); //uid
char pwd[PATH_MAX]={0}; //用于存储当前路径
getcwd(pwd,sizeof(pwd));
printf("%s@%s %s%c ",getpwuid(uid)->pw_name,host,pwd,getuid()?'$':'#');fflush(stdout);
gets(buf);
char* ag[5]={0};
for(i=0;i<5;i++){
ag[i]=(char* )malloc(sizeof(10));
}
//将命令分解为字符串数组
i=0;
while(1){
if(' '==buf[i]){
strncpy(ag[j],buf+p,i-p);
p=i+1;
j++;
}
if('\0'==buf[i]){
strncpy(ag[j],buf+p,i-p);
ag[j+1]=NULL; //exevp()需要
break;
}
i++;
}
//处理cd
if(!strcmp("cd",ag[0])){
if(!strcmp("~",ag[1])){
char tmp[20]="/home/";//,usr);
ag[1]=strcat(tmp,getpwuid(uid)->pw_name);
}
char newPath[100]={0};
strcpy(newPath,ag[1]);
chdir(newPath);
continue;
}
//处理ls *
if(!strcmp(ag[0],"ls") && NULL!=ag[1] && !strcmp(ag[1],"*")){
strcpy(ag[1],".");
ag[2]=NULL;
}
pid_t pid=fork();
if(0==pid){
//重定向
if(NULL!=ag[2] && !strcmp(ag[2],">")){
FILE* fp1=freopen(ag[3],"w+",stdout);
}
if(NULL!=ag[2] && !strcmp(ag[2],">>")){
FILE* fp2=freopen(ag[3],"a+",stdout);
}
if(NULL!=ag[2] && !strcmp(ag[2],"2>")){
FILE* fp3=freopen(ag[3],"w+",stderr);
}
if(NULL!=ag[2] && !strcmp(ag[2],"<")){
FILE* fp4=freopen(ag[3],"w+",stdin);
}
execvp(ag[0],ag);
}
else{
wait(NULL);
}
}
return 0;
}
执行结果
$./a.out
linux@ubuntu /home/linux/Desktop/161028$ ls
1 2 a.out my_shell.c
linux@ubuntu /home/linux/Desktop/161028$ ls -l
total 24
-rw-rw-r-- 1 linux linux 2008 10月 28 21:15 1
-rw-rw-r-- 1 linux linux 4312 10月 28 21:18 2
-rwxrwxr-x 1 linux linux 7837 10月 29 12:48 a.out
-rw-rw-r-- 1 linux linux 1892 10月 29 12:48 my_shell.c
linux@ubuntu /home/linux/Desktop/161028$ cd ..
linux@ubuntu /home/linux/Desktop$ ls -l > 1
ls: cannot access >: No such file or directory
linux@ubuntu /home/linux/Desktop$ cat 1
-rw-rw-r-- 1 linux linux 0 10月 29 12:52 1
linux@ubuntu /home/linux/Desktop/hqyj$
my_shell的更多相关文章
- sql server 2012 数据引擎任务调度算法解析(下)
上次我们说到,sql server 2012的企业版的任务调度流程,一直到给新连接分配了scheduler,都是与以前的版本算法是一致的,只有在进行任务分配的时候,算法才有了细微的调整. 新算法的目的 ...
- sql server 2012 数据引擎任务调度算法解析(上)
微软在sql server 2012版本之后,引入了新的任务调度算法,这个算法与之前的版本有一些细微的差别.我在这里试着简单描述一下,一些基本概念就不再赘述了,比如NUMA.scheduler.wor ...
- 发现一php木马代码
<?php ;//无需验证密码! $shellname='hello~地球~猴子星球欢迎你 '; define('myaddress',__FILE__); error_reporting(E_ ...
- M_LROOT,LD_LIBRARY_PATH, “Not all extension Dlls were loaded”问题原因及解决方法(持续更新)
最近在需要在云主机上进行压力测试,所以需要Linux的Agent. 一.安装:教程可以百度,大概步骤如下: 1.Upload Linux.zip to 指定的机器 2.解压,chmod 777 $Li ...
- linux下实现自己的shell解释器
实现一个自己的shell解释器,其原理比较简单,首先获取用户的输入,通过fork()函数获取两个进程(父子进程),子进程通过execvp()函数继续进行,此时父进程一直在等待子进程的结束,待都结束了就 ...
- 测者的性能测试手册:快速安装LoadRunner Linux上的Generator
安装和初始化 安装包 上传Linux.zip(LoadRunner Generator for Linux.zip,后台回复loadrunner获取下载地址),然后通过如下命令: unzip Linu ...
- linux命令(37):paste,合并两个文件,对应行为一行
paste的格式为: paste -d -s -file1 file2 选项的含义如下: -d 指定不同于空格或t a b键的域分隔符.例如用@分隔域,使用- d @.如果不指定,默认用空格分割 -s ...
- django项目中使用项目环境制作脚本 通过终端命令运行脚本文件
在实际的django项目开发中,有时候需要制作一些脚本文件对项目数据进行处理,然后通过终端命令运行脚本. 完整的实现流程如下: 1.在一个应用目录下(app, 必须是在应用目录下,可以专门创建一个应用 ...
- 解决命令行执行shell脚本成功,但crontab执行失败
实际生产案例 生产机房自建PPTP客户端通过拨号连接到生产机房,但是一旦客户端网络是意外断线再重新拨号 会产生IP冲突,于是写了一个脚本监控PPTP的IP是否有多个(一般冲突以后会生成2个IP) #! ...
随机推荐
- Oracle 数据库基础学习 (六) 子查询
子查询在一个select中出现多个嵌套查询语句 1.在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供 ...
- GitHub for windows 使用方法
1. ①http://windows.github.com/ 下载GitHub for Windows,大约660K,一个在线安装程序,如图: ②.运行GitHubSetup.exe,如下图,可能会下 ...
- a标签的href值
<a href='#'>click</a>实验证明,页面上能不用这个值就最好不要用这个#,这个#会让你的页面瞬间滚动到页面的顶部,我不知道已经踩了多少次坑了,就是因为这个'#' ...
- a标签的target属性
_blank 浏览器总在一个新打开.未命名的窗口中载入目标文档. _self 这个目标的值对所有没有指定目标的 <a> 标签是默认目标,它使得目标文档载入并显示在相同的框架或者窗口中作为源 ...
- 图解.NET Stack和Heap的本质区别
现在越来越觉得对.NET基本概念的理解和掌握对于提升编程水平的重要性,先从.NET的 Stack(栈)和Heap(堆)说起,计算机的内存可以分为代码块内存,stack内存和heap内存.代码块内存是在 ...
- Slideout.js – 触摸滑出式 Web App 导航菜单
Slideout.js 是为您的移动 Web 应用开发的触摸滑出式的导航菜单.它没有依赖,自由搭配简单的标记,支持原生的滚动,您可以轻松地定制它.它支持不同的 CSS3 转换和过渡.最重要的是,它只是 ...
- Gogs - 基于 Go 语言的自助 Git 服务
Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务.Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...
- 【移动适配】一个像素的border怎么实现
一个像素里复杂纷扰的世界 文 | 啃先生 Mar.3rd.2016 首发于微信公众号(啃先生) 上一篇发了<[移动适配]移动Web怎么做屏幕适配> 壹 | Fisrt 在CSS的世界里P ...
- Visual Studio 2013 的 Xamarin 安装教程
Xamarin 配置手册和离线包下载 http://pan.baidu.com/s/1eQ3qw8a 具体操作: 安装前提条件 1. 安装Visual Studio 2013,安装过程省略,我这里安 ...
- sharepoint列表如何进行随机取几条记录?
sharepoint列表如何进行随机取记录?由于itemid是不连续.可能存在删除添加等操作导致 我们可以采用随机取第几条记录.把记录集合取出来.产生随机第几条数.这里关键是如何产生不重复的随机数 方 ...