#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pwd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main()
{
char* name;//获取当前的用户名,当然,当前的主机名也可以使用函数获取,可以自行翻阅手册
struct passwd* pwd;
pwd = getpwuid(getuid());
name = pwd->pw_name;
while(1)//保证自己写的shell一直运行下去
{
printf("[%s]@host_name# ",name);//打印用户名、主机名
fflush(stdout);//刷新标准输出流
char buf[1024];
ssize_t readsize = read(0,buf,sizeof(buf)-1);//使用read的系统调用,读取从标准输入的字符信息
if(readsize>0)//如果正常读取出来字符,为了保证字符串的合理性,最后一位放上'\0',
buf[readsize-1]=0;
char *start=buf;
char *_argv[32];
_argv[0]=start;//设立一个指针,和一个二维数组,从buf开始
int i=1;
int k=0;
while(*start)
{
if(*start == ' ')//遇到空格时,表示键盘输入的一个单词或者字符串结束
{
*start='\0';//将当前的空格字符换为'\0'结束符
start++;
_argv[i++] = start;//并将写一个字符串的起始地址赋给二维数组
}
else
start++;//否则,继续遍历键盘输入的字符串
}
_argv[i]=NULL;//最终,给二维数组有效数据的下一位无效组赋为空,防止访问越界
pid_t id=fork();//创建子进程
if(id<0)
{
perror("fork");
return 1;
}
if(id == 0)
{
for(k=0;k<i;k++)
{
if(strcmp(_argv[k],">") == 0)//如果键盘输入的字符中有'>'重定向符号的存在
{
char *file=_argv[k+1];//记录下一个字符串的数据,作为文件名
_argv[k]=NULL;//将此串字符串的值直接设为NULL,放弃访问或执行后续操作
close(1);//关闭输出
int fd = open (file,O_WRONLY|O_CREAT);//打开文件,则此时文件描述符为1,本来写到输出的数据均会写入到文件中
break;
}
}
execvp(_argv[0],_argv);//使用execvp函数进行进程程序的替换
exit(2);
fflush(stdout);
}
}
return 0;
}
Linux shell的模拟,并实现输出重定向
最新推荐文章于 2019-09-17 19:39:22 发布