【Linux学习笔记】----minishell(C语言版)

1.流程流程

  1. 标准输入
    输入字符,并且最后一个字符设置为\0
  2. 判断是否有重定向符号
    将文件名截取出来。
  3. 输入解析
    将输入的字符读取出来,放到字符串指针数组里,
  4. 进程分离与替换
    ./minishell放到argv[0]的位置,启动程序,后面输入为的命令
    由于我们获取的字符时,将最后的位置\n获取了,所以置NULL。
  5. 进程等待
    .防止子进程变成僵尸进程。

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函数,重定向操作,有了更深的理解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值