#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <wait.h>
#include <ctype.h>
int main()
{
char file[32] = {0};
char cmd[1024] = {0};
printf("shell:");
fflush(stdout);
//%[^\n] 遇到\n结束输入
//%*c 删除最后一个字符
if(scanf("%[^\n]%*c",cmd) != 1)
{
getchar();
}
//解析输入输出重定向
char *ptr = cmd;
int flag = 0;
while(*ptr != '\0')
{
if(*ptr == '<')
{
*ptr = ' ';
ptr++;
}
if(*ptr == '>')
{
*ptr++ = '\0';
flag = 1;
if(*ptr == '>')
{
flag = 2;
*ptr++ = '\0';
}
while(*ptr != '\0' && isspace(*ptr))
{
ptr++;
}
strcpy(file,ptr);
}
ptr++;
}
//解析字符
ptr = cmd;
char *argv[32] = {NULL};
int argc = 0;
while(*ptr != '\0')
{
if(!isspace(*ptr))
{
argv[argc++] = ptr;
while(!isspace(*ptr)&& *ptr != '\0')
ptr++;
continue;
}
else{
*ptr = '\0';
}
ptr++;
}
//创建子进程,运行命令
int pid = fork();
if(pid <0)
{
perror("fork error");
exit(-1);
}else if(pid == 0)
{
int fd = -1;
if(flag == 1) //重定向
{
fd = open(file,O_CREAT|O_WRONLY,0664);
dup2(fd,1);
}else if(flag == 2)
{
fd = open(file,O_CREAT|O_APPEND|O_WRONLY,0664);
dup2(fd,1);
}
execvp(argv[0],argv); //替换进程
}
wait(NULL); //接收子进程,避免子进程称为僵尸进程(虽然不太可能)
return 0;
}
编写简单的shell(输入输出重定向)
最新推荐文章于 2022-12-03 22:54:17 发布