linux下c语言实现sh.c

本文探讨了一个C程序,它解析用户输入的指令并调用内建函数如`cd`, `pwd`,以及fork-exec机制实现自定义命令执行。通过`buildin_command`和`mysys`函数,展示了如何处理基本系统操作和子进程管理。
摘要由CSDN通过智能技术生成
#include<unistd.h>
#include<stdio.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
#define MAX_CMD 1024
#define MAX_DIR_NAME 1024
int buildin_command(char **argv){
    if(strcmp(argv[0],"exit")==0){
        exit(0);
    }
    if(strcmp(argv[0],"cd")==0){
        if(chdir(argv[1])){
            printf("cd error%s:no such directory\n",argv[1]);
        }
        return 1;
    }
    if(strcmp(argv[0],"pwd")==0){
        char buf[MAX_DIR_NAME];
        printf("%s\n",getcwd(buf,sizeof(buf)));
        return 1;
    }
    return 0;//not a buildin_command
}

void split(char *buf,char **argv)
{
    while(*buf==' '){
        buf++;
    }
    int delim = 0;
    int argc = 0;
    while(*buf != '\n'){
        while(buf[delim]!='\n' && buf[delim]!=' '){
            delim++;
        }
        if(buf[delim] == '\n'){
            buf[delim] = '\0';
            argv[argc++] = buf;
            break;
        }
        buf[delim] = '\0';
        argv[argc++] = buf;
        buf += delim + 1;
        delim = 0;
        while(*buf == ' ') buf++;
    }
    argv[argc] == NULL;
    
}


void mysys(char *str)
{
    char buf[1024];
    char **params;
    params = (char**)malloc(1024*sizeof(char*));
    strcpy(buf,str);
    split(buf,params);
    if(params[0] == NULL) return;
    if(buildin_command(params)) return;
    pid_t pid;
    pid = fork();
    if(pid == 0){
        if(execvp(params[0],params) < 0) {
            printf("command not found\n");
            exit(0);}

    }
    wait(NULL);
}

int main(int argc,char *argv[]){

    char cmdstring[MAX_CMD];
    int n;
    while(1){
        printf(">");
        fflush(stdout);

        /*read*/
        if((n=read(0,cmdstring,MAX_CMD))<0){
            printf("read error");
        }

        mysys(cmdstring);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值