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

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

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

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

/*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. Java中的Scanner类

    java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入.创建Scanner对象的基本语法: Scanner s = new Scanner(System. ...

  2. BZOJ 1295 最长距离 BFS+枚举

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1295 题目大意: windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有 ...

  3. 报错 Filtered offsite request

    用scrapy框架迭代爬取时报错 scrapy日志: 在 setting.py 文件中 设置 日志 记录等级 LOG_LEVEL= 'DEBUG' LOG_FILE ='log.txt' 观察 scr ...

  4. Linux学习总结(十八)几个简单的文本处理工具cut sort tr split

    1 命令cut 用来截取某一个字段格式 : cut -d '分隔符' [-cf] n, n为数字,表示第几段-d:后面跟分隔符,分割符要加单引号-c:后面接的是第几个字符-f:后面接的是第几段那么意思 ...

  5. 3、Web Service-Jaxws(Eclipse版本)

    1.概述 开发手段: 使用jdk开发(1.6及以上的版本) 使用CXF框架开发 组成: -服务器端 -客户端 2.使用JDK开发 1).服务器端 -@WebService(SEI和SEI的实现类) - ...

  6. QTP基本方法3-----截屏

    1.桌面截屏 Desktop.captureBitMap  path[,bolean] path:保存路径,可选择绝对路径或相对路径 相对路径是保存在脚本保存的目录下编号最大的res目录下. bole ...

  7. Dubbo实践(十五)消费者引用服务

    Refer取得invoker的过程 <!-- 指定了哪种的注册中心,是基于zookeeper协议的,指定了注册中心的地址以及端口号 --> <dubbo:registry proto ...

  8. web测试--数据分层测试

    转自:51Testing 测试效率低下?很多时间都在等程序开发功能,直到界面层展现出来数据后,我们才能介入测试,然后忙的焦头烂额,上线前心里还没底.亦或者发现一个Bug,发给程序猿A查,程序猿A说,可 ...

  9. 结合cocos2d-x开发配置sublime text

    开发cocos2d-x前端的非核心开发人员对于编辑器的选择,多数的选择有两个,一个是传统的ultraedit,另外的就是现在很流行的sublime text.以前我是比较喜欢用ultraedit的,但 ...

  10. STM32F103 ucLinux开发之三(内核启动后不正常)(完结)

    STM32F103 ucLinux内核没有完全启动 从BOOT跳转到内核后,执行一长段的汇编语言,然后来到startkernel函数,开启C语言之旅. 但是内核输出不正常,如下所示: Linux ve ...