Создание собственной оболочки в C - PullRequest
1 голос
/ 23 февраля 2011

Я пытаюсь создать свою собственную оболочку на C, но у меня проблемы со strtok.Я использую его для правильного разбора команды и аргументов из входных данных, но я не могу получить его для анализа пути (в настоящее время это segfaults).Как только я правильно проанализировал путь, я смогу вызывать execlp для каждого куска и обрабатывать процессы соответственно.Любая идея будет принята с благодарностью, код ниже.Также не стесняйтесь комментировать выбор стиля, если вы думаете, что я могу сделать что-то лучше.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void parse(char *, char *);
void process(char *, char *, int);

int main(int argc, char *argv[]) {
  char *command;
  char *path;
  char buffer[1024];
  command = (char *)malloc(sizeof(char));
  path = (char *)malloc(sizeof(char));
  int loop = 1;
  while(loop == 1){
    path = getenv("MYPATH");
    if(path == NULL)
      path = "/bin#.";
    printf("($MYPATH is %s)\n", path);

    printf("myshell$ ");
    command = fgets(buffer, 1024, stdin);
    printf("Buffer: %s", buffer);
    printf("Command: %s", command);

    if(strcmp(command,"exit\n") == 0 || strcmp(command, "quit\n") == 0){
      loop = 0;
      printf("Program Terminated\n");
    }
    parse(command, path);
  }
  return 0;
}

void parse(char *command, char *path){
  char *argv;
  int argNum = 0;
  argv = strtok(command, " ");
  while(argv != NULL){
    printf("%s %d\n", argv, argNum);
    argv = strtok (NULL, " ");
    argNum++;
    }
  printf("Calling...\n");
  process(argv, path, argNum);
  printf("Called\n");
}

void process(char *argv, char *path, int argNum){
  char *pathPiece;
  int pathNum = 0;
  pathPiece = strtok(path, "#");
  while(pathPiece != NULL){
    printf("%s %d\n", pathPiece, pathNum);
    pathPiece = strtok(NULL, "#");
    pathNum++;
  }
}

Ответы [ 2 ]

5 голосов
/ 23 февраля 2011

Вы устанавливаете путь, чтобы указывать на область памяти, доступную только для чтения, и вызов strtok для нее, вероятно, является причиной ваших проблем, когда strtok пытается ее токенизировать (т.е. написать нулевой символ где-то внутри него) .

Возможно, вам нужно что-то вроде:

char path[1024];

и звоните strcpy как:

strcpy(path, getenv("MYPATH"));

и

strcpy(path, "/bin#.");

Я настоятельно рекомендую вам прочитать об обработке строк в C.

2 голосов
/ 23 февраля 2011

Следующие не будут иметь желаемого эффекта

path = "/bin#.";

Попробуйте strcpy( path, "/bin#." );.

И, как сказал larsmans, исправьте malloc так, чтобы вы выделяли достаточно байтов для размера команды.

Кроме того, если это C, для которого вы строго компилируете, у вас должна быть ошибка компиляции при объявлении целого числа loop в вашей позиции.

...