发一波福利,操作系统的实验内容,大家可以借鉴一下,不过我的代码可能也存在一定的问题。

因为在一开始老师是一节一节课教的,当时并不知道后面还会用输入输出重定向,管道等一系列问题,我的兴趣也不在这个方面也没有预习,所以一来代码写的比较丑,二来没有对于代码进行一个合理的规划,写的也比较乱。

代码暂时实现到输入输出重定向,之后可能会加上管道处理等方面的程序。

如果让我重新写这段代码应该会规划的更好一点吧

/*author:Samsons
date:2015.4.10*/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/wait.h> #define MAX(100)
#define LEN(100) char *arglist[MAX]; //shell指令参数表
int num; //shell指令参数个数 int execute(char* arglist[])//执行外部命令
{
int error;
error=execvp(arglist[],arglist);
if (error==-) printf("failed\n");
exit();
} char* make(char *buf)//将字符串传入参数表内
{
char *cp;
cp=malloc(strlen(buf)+);
if (cp==NULL)
{
fprintf(stderr,"no memory\n");
exit();
}
strcpy(cp,buf);
return cp;
} int my_system(char *buf,char *arglist[])//对于字符串进行分割
{
int num,j,i,last;
char buffer[LEN];
num=;
i=;
while (num<MAX)
{
if (buf[i]=='\n')
{
arglist[num]=NULL;
return num;
}
if (buf[i]==' ') i++;
last=i;
while (buf[i]!=' ' && buf[i]!='\n') i++;
for (j=last;j<i;j++) buffer[j-last]=buf[j];
buffer[j-last]='\0';
arglist[num++]=make(buffer);
}
}
int inner(char *arglist[])//执行内置指令
{
if (strcmp(arglist[],"exit\0")==)//exit
{
exit();
return ;
}
else
if (strcmp(arglist[],"pwd\0")==)//pwd
{
char buf[LEN];
getcwd(buf,sizeof(buf));//获得当前目录
printf("Current dir is:%s\n",buf);
return ;
}
else
if (strcmp(arglist[],"cd\0")==)//cd
{
char buf[LEN];
if (chdir(arglist[])>=)
{
getcwd(buf,sizeof(buf));
printf("Current dir is:%s\n",buf);
}
return ;
}
else return ;
} void cat_in(char *q)//输入重定向
{
char t[];
int fd;
if (q[]=='<')
{
strcpy(t,q+);
fd=open(t,O_RDONLY);
arglist[]=NULL;
if (fd==-)
{
printf("file open failed\n");
return;
}
dup(fd,);
close(fd);
}
} void cat_out(char *q)//输出重定向
{
char t[];
int fd;
if (q[]=='>')
{
strcpy(t,q+);
arglist[num-]=NULL;
num--;
fd=open(t,O_CREAT|O_RDWR);
if (fd==-)
{
printf("file open failed\n");
return;
}
dup2(fd,);
close(fd);
}
} int main()
{
int i,pid;
char buf[LEN];
while ()
{
fgets(buf,LEN,stdin);//读入单行指令
num=my_system(buf,arglist);//指令分割
int inner_flag;
inner_flag=inner(arglist);//内置指令判断
if (inner_flag==)
{
pid=fork();//建立新的进程
if (pid==)
{
if (arglist[]!=NULL)
{
char q[LEN];
strcpy(q,arglist[]);
cat_in(q);//输入重定向
}
if (arglist[num-]!=NULL)
{
char q[LEN];
strcpy(q,arglist[num-]);
cat_out(q);//输出重定向
}
execute(arglist);//执行
}
waitpid(pid,NULL,);
}
}
return ;
}

Linux 用C语言实现简单的shell(1)的更多相关文章

  1. Linux 用C语言实现简单的shell(2)

    不知不觉两周没有发文了,因为“一万美金的福特奖学金答辩”,ACM比赛,网络论文阅读和网络大作业一大堆事把时间冲散了,所以先写一篇博文补上之前一坑. 之前发了一篇关于linux 用C语言实现简单shel ...

  2. linux下c语言实现简单----线程池

    这两天刚好看完linux&c这本书的进程线程部分,学长建议可以用c语言实现一个简单的线程池,也是对线程知识的一个回顾与应用.线程的优点有好多,它是"轻量级的进程",所需资源 ...

  3. 如何在linux下编写一个简单的Shell脚本程序

    在了解了linux终端和其搭配的基本Shell(默认为bash)的基础下,我们就可以在终端中用vi/vim编辑器编写一个shell的脚本程序了 Shell既为一种命令解释解释工具,又是一种脚本编程语言 ...

  4. Linux系统学习笔记之 1 一个简单的shell程序

    不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步: ...

  5. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

  6. Unix和Linux下C语言学习指南

    转自:http://www.linuxdiyf.com/viewarticle.php?id=174074 Unix和Linux下C语言学习指南 引言 尽管 C 语言问世已近 30 年,但它的魅力仍未 ...

  7. Linux学习之路(三)Shell脚本初探

    本文参考链接:http://www.runoob.com/linux/linux-shell.html 基本说明 Shell脚本(shell script)是一种为shell编写的脚本程序.其中she ...

  8. Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)

    Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...

  9. 如何写一个简单的shell

    如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...

随机推荐

  1. 把所有的小图标一起做成雪碧图吧 请用gulp-css-spriter.

    用gulp-css-spriter很简单. 第一步: 在某个文件夹用shitf+鼠标右键 第二步: npm install gulp-css-spriter https://www.npmjs.com ...

  2. PHPmyadmin拿shell总结

    PHPmyadmin修改用户密码 直接点击上面的localhost或者1270.0.1,出现用户一栏,点击修改即可 添加超级用户guetsec密码ooxx并且允许外连 GRANT ALL PRIVIL ...

  3. oracle-记录

    同時查新多个条件的数量 select sum(DECODE(trim(t.ASSESSED_RESULT),'维持',1,0)) maintainNum, sum(DECODE(trim(t.ASSE ...

  4. 使用Java语言开发机器学习框架和参数服务器

    https://github.com/wudikua/ps 本项目是我自己动手实现的机器学习训练框架,代码简单,有很多不完善,但是也保留了最小可用功能 通过自己编写这个项目,可以帮助自己入门机器学习 ...

  5. Apache Jemeter 开发插件

    为什么选择使用JMeter 当被问到这个问题的时候,也许你会在脑海里产生很多的理由,比如: Apache基金会下的开源项目,没有版权问题: 为数不多的还在持续更新的开源性能自动化测试工具: 支持协议丰 ...

  6. python对列表中的字典进行排序

    数据显示为: rows=[{'日期': '2018-09-04', '测试1': '50.00 %', '测试2': '100.00%'}, {'日期': '2018-09-05', '测试1': ' ...

  7. JavaScript获取距离某天前或后的日期

    /** * param  Date Object:Mon May 11 13:53:08 UTC+0800 2015  * n 自param 起向后多少天 * return Date Object:M ...

  8. Odoo中的onchange

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9280723.html  [onchange=前端js函数,可以实现前端实时更新以及修改验证] onchange ...

  9. Week7:SVM难点记录

    1.函数dataset3Params(),如何计算模型估计偏差的? model=svmTrain(X,y,c_array,@(x1,x2)gaussianKernel(x1,x2,sigma_arra ...

  10. PAT——1034. 有理数四则运算

    本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分 ...