303030

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <string.h>

#define BUFFER_SIZE 1024

#define TOKEN_DELIMITERS " \t\r\n\a"

void execute_command(char **args) {

    pid_t pid, wpid;

    int status;

    pid = fork();

    if (pid == 0) {

        // 子进程

        if (execvp(args[0], args) == -1) {

            perror("execvp");

        }

        exit(EXIT_FAILURE);

    } else if (pid < 0) {

        // fork 失败

        perror("fork");

    } else {

        // 父进程

        do {

            wpid = waitpid(pid, &status, WUNTRACED);

        } while (!WIFEXITED(status) && !WIFSIGNALED(status));

    }

}

char **parse_command(char *command) {

    int buffer_size = BUFFER_SIZE;

    int position = 0;

    char **tokens = malloc(buffer_size * sizeof(char *));

    char *token;

    if (!tokens) {

        fprintf(stderr, "Allocation error\n");

        exit(EXIT_FAILURE);

    }

    token = strtok(command, TOKEN_DELIMITERS);

    while (token != NULL) {

        tokens[position] = token;

        position++;

        if (position >= buffer_size) {

            buffer_size += BUFFER_SIZE;

            tokens = realloc(tokens, buffer_size * sizeof(char *));

            if (!tokens) {

                fprintf(stderr, "Allocation error\n");

                exit(EXIT_FAILURE);

            }

        }

        token = strtok(NULL, TOKEN_DELIMITERS);

    }

    tokens[position] = NULL;

    return tokens;

}

void shell_loop() {

    char *command;

    char **args;

    int status;

    do {

        printf("> ");

        command = malloc(BUFFER_SIZE * sizeof(char));

        if (!command) {

            fprintf(stderr, "Allocation error\n");

            exit(EXIT_FAILURE);

        }

        if (fgets(command, BUFFER_SIZE, stdin) == NULL) {

            printf("\n");

            break;

        }

        args = parse_command(command);

        execute_command(args);

        free(command);

        free(args);

    } while (status);

}

int main() {

    shell_loop();

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值