1.流程流程
- 标准输入
输入字符,并且最后一个字符设置为\0 - 判断是否有重定向符号
将文件名截取出来。 - 输入解析
将输入的字符读取出来,放到字符串指针数组里, - 进程分离与替换
./minishell放到argv[0]的位置,启动程序,后面输入为的命令
由于我们获取的字符时,将最后的位置\n获取了,所以置NULL。 - 进程等待
.防止子进程变成僵尸进程。
2.代码展示
#include<stdio.h>//printf
#include<sys/wait.h>//wait
#include<string.h>//strlen
#include<unistd.h>//exec/fork
#include<stdlib.h>
#include<fcntl.h>
int main()
{
while (1)
{
printf("[xff@minishell]$ ");
fflush(stdout);
//1.wait put
char buf[1024]={0};
fgets(buf,1023,stdin);
buf[strlen(buf)-1]='\0';
char *argv[32]={NULL};
int argc=0;
char *ptr = buf;
char *data =NULL;
int file_flag=0;
//1.5redirct
while (*ptr!='\0')
{
if (*ptr=='>')
{
file_flag=1;
*ptr='\0';
++ptr;
if (*ptr=='>')
{
file_flag=2;
++ptr;
}
while (*ptr!='\0' && *ptr==' ')
++ptr;
if (*ptr!='\0')
{
data = ptr;
while (*ptr!='\0' && *ptr!=' ')
++ptr;
*ptr='\0';
}
}
++ptr;
}
//2.read
ptr=buf;
while (*ptr!='\0')
{
if (*ptr!=' ')
{
argv[argc]=ptr;
++argc;
while (*ptr!=' ' && *ptr!='\0')
{
++ptr;
}
*ptr='\0';
}
++ptr;
}
argv[argc]=NULL;
//3.fork && process replace
pid_t pid = fork();
if (pid==0)
{
if (file_flag==1)
{
int fd = open(data,O_WRONLY|O_TRUNC|O_CREAT,0664);
dup2(fd,1);
}
if (file_flag==2)
{
int fd = open(data,O_WRONLY|O_APPEND|O_CREAT,0664);
dup2(fd,1);
}
execvp(argv[0],argv);
perror("execvp error");
exit(0);
}
//4.wait child pid
waitpid(pid,NULL,0);
}
return 0;
}
3.结果展示
[xff@bogon test708]$ ./minishellc
[xff@minishell]$ ls -l
总用量 36
drwxrwxr-x 2 xff xff 55 7月 16 13:28 dir709
-rw-rw-r-- 1 xff xff 110 7月 17 20:47 makefile
-rwxr-xr-x 1 root root 8632 7月 17 00:36 minishell
-rwxrwxr-x 1 xff xff 8984 7月 17 21:12 minishellc
-rw-rw-r-- 1 xff xff 619 7月 17 00:36 minishell.c
-rw-rw-r-- 1 xff xff 1042 7月 17 21:11 minishell.cc
[xff@minishell]$ ls -a
. .. dir709 makefile minishell minishellc minishell.c minishell.cc
[xff@minishell]$ pwd
/home/xff/test/test708
[xff@minishell]$ ls -l > a.txt
[xff@minishell]$ cat a.txt
总用量 72
-rw-rw-r-- 1 xff xff 0 7月 19 01:05 a.txt
-rwxrwxr-x 1 xff xff 8736 7月 8 08:23 file708
-rwxrwxr-x 1 xff xff 8488 7月 9 23:41 file709
-rwxrwxr-x 1 xff xff 8568 7月 17 21:53 fork
-rwxr-xr-x 1 xff xff 8632 7月 17 00:36 minishell
-rwxrwxr-x 1 xff xff 9136 7月 19 01:04 minishellc
-rw-rw-r-- 1 xff xff 619 7月 17 00:36 minishell.c
-rw-rw-r-- 1 xff xff 2118 7月 19 01:04 minishell.cc
-rw-rw-r-- 1 xff xff 457 7月 17 21:54 vfork.c
[xff@minishell]$ ls -l >> a.txt
[xff@minishell]$ cat a.txt
总用量 72
-rw-rw-r-- 1 xff xff 0 7月 19 01:05 a.txt
-rwxrwxr-x 1 xff xff 8736 7月 8 08:23 file708
-rwxrwxr-x 1 xff xff 8488 7月 9 23:41 file709
-rwxrwxr-x 1 xff xff 8568 7月 17 21:53 fork
-rwxr-xr-x 1 xff xff 8632 7月 17 00:36 minishell
-rwxrwxr-x 1 xff xff 9136 7月 19 01:04 minishellc
-rw-rw-r-- 1 xff xff 619 7月 17 00:36 minishell.c
-rw-rw-r-- 1 xff xff 2118 7月 19 01:04 minishell.cc
-rw-rw-r-- 1 xff xff 457 7月 17 21:54 vfork.c
总用量 76
-rw-rw-r-- 1 xff xff 463 7月 19 01:05 a.txt
-rwxrwxr-x 1 xff xff 8736 7月 8 08:23 file708
-rwxrwxr-x 1 xff xff 8488 7月 9 23:41 file709
-rwxrwxr-x 1 xff xff 8568 7月 17 21:53 fork
-rwxr-xr-x 1 xff xff 8632 7月 17 00:36 minishell
-rwxrwxr-x 1 xff xff 9136 7月 19 01:04 minishellc
-rw-rw-r-- 1 xff xff 619 7月 17 00:36 minishell.c
-rw-rw-r-- 1 xff xff 2118 7月 19 01:04 minishell.cc
-rw-rw-r-- 1 xff xff 457 7月 17 21:54 vfork.c
4.心得体会
通过这次练习,我对fork,wait,exec函数,重定向操作,有了更深的理解。