微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【进程控制下】实现一个简易的shell

1.shell原理
运用程序替换的原理来实现的,shell自己就是一个进程。

1.获取命令行
2.解析命令行
3.创建子进程(fork)
4.替换子进程(exec5.父进程等待子进程退出(wait)

2.shell

#include <unistd.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

char *argv[8]; 
int argc = 0;

void do_parse(char *buf)  //解析
{
    int i;
    int status = 0;
    for (argc=i=0; buf[i]; i++ ) 
    {
        if ( !isspace(buf[i]) &&status == 0 )
        { 
            argv[argc++] = buf+i;  //将输入的命令存入数组
            status = 1;
        } else if ( isspace(buf[i]) ) 
        { 
            status = 0;
            buf[i] = 0;
        }
    }   
    argv[argc] = NULL;
}

void do_execute( void )  //替换
{
    pid_t pid = fork();
    switch( pid ) 
    { 
        case -1: 
        perror("fork");  //创建进程失败
        break;
        case 0:   //子进程
        execvp(argv[0],argv);  //替换子进程
        perror("execvp");
        exit(EXIT_FAILURE); 
        default:  //父进程
        {
            int st;
            while ( wait(&st) != pid )  //成功返回被等待进程pid,失败返回-1。
                ;   
        }
    }
}

int main( void )
{
    char buf[1024] = {}; 
    while ( 1 ){
    printf("myshell@host: "); 
    scanf("%[^\n]%*c",buf); 
    //%[^\n] 读入任意多的字符,直到遇到"\n"停止
    do_parse(buf); 
    do_execute();
    }
    return 0;
}

实现效果

原文地址:https://www.jb51.cc/bash/388220.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐