在C中实现命令行解释器,特殊情况

时间:2017-04-28 13:50:13

标签: c shell command-line

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

#define BUFFER 64

char *read_command(void);
char **parse_line(char *line);
int execute(char **arguments);

int main(void)
{
    char *command = NULL;
    char **arguments;
    int status;

    do
    {
        printf("protoulis_7968> ");
        command = read_command();
        arguments = parse_line(command);
        status = execute(arguments);

        free(arguments);
        free(command);

    }while(status);
}

char *read_command(void)
{
    char *command = NULL;
    ssize_t buf = 0;
    getline(&command, &buf, stdin);
    return command;
}

char **parse_line(char *line)
{
    int buffer = BUFFER;
    int pos = 0;
    char **tokens = malloc(buffer * sizeof(char*));
    char *token;
    if (!tokens)
    {
        printf("Error allocating memory with malloc\n");
        exit(0);
    }
    token = strtok(line, " \t\r\n\a");
    while(token != NULL)
    {
        tokens[pos] = token;
        pos++;

        if (pos >= buffer)
        {
            buffer += BUFFER;
            tokens = realloc(tokens, buffer * sizeof(char*));
            if (!tokens)
            {
                printf("Error reallocating memory!\n");
                exit(0);
            }
        }
        token = strtok(NULL, " \t\r\n\a");
    }
    tokens[pos] = NULL;
    return tokens;
}

int execute(char **arguments)
{
//  printf("%*c\n", arguments);
    int pid, waitPid, status;

    pid = fork();

    if(pid == 0)    //child process
    {
        if (execvp(arguments[0], arguments) == -1)
            perror("Error with EXECVP\n");
    }
    else if (pid < 0)
        perror("Error PID < 0\n");
    else    //parent process
    {
        do
        {
            waitPid = waitpid(pid, &status, WUNTRACED);
        }while(!WIFEXITED(status) && !WIFSIGNALED(status));
    }
    return 1;
}

好吧,我已经编写了上面的代码来模拟C中的命令行解释器。我希望能够通过在一行中输入它们来执行多个命令。我的意思是我想传递作为输入,例如行:ls -l;触摸hello.c; PWD。通过整行后,我想用分号分隔命令,让系统按任意顺序执行每个命令。我相信我必须使用strtok函数,但已经做了很多尝试并且没有管理任何东西。任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:1)

在你的情况下,

strtok是不够的。原因是它会将您带到下一个子命令,但是为了能够执行此子命令,您必须将它作为单个字符串。

解决此问题的两种方法:

  1. 算多少';'有,用'\ 0'替换它们在内存中有几个连续的字符串,然后逐个执行它们。
  2. 编写一个函数,将命令字符串拆分为2d子命令数组,然后逐个执行。
  3. 如果你需要一些灵感,这是一个代码: