簡體   English   中英

用C制作自己的shell

[英]Making own shell in C

我正在嘗試在C中創建自己的shell,但是strtok遇到了麻煩。 我用它來正確地從輸入中解析出命令和參數,但是我不能用它來解析路徑(當前是段錯誤)。 一旦我正確地解析了路徑,我應該能夠在每個片段上調用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++;
  }
}

您正在設置路徑以指向只讀內存位置,並且在strtok嘗試對其進行標記化時(即在其中的某個地方寫一個空字符),對它調用strtok可能是導致問題的原因。

您可能需要類似:

char path[1024];

並像這樣調用strcpy

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

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

我強烈建議您閱讀C語言中的字符串處理。

以下將不會達到預期的效果

path = "/bin#.";

嘗試strcpy( path, "/bin#." ); 代替。

而且,正如larsmans所說,請修復malloc,以便為命令的大小分配足夠的字節。

另外,如果您要嚴格為其編譯C,那么在您所處的位置聲明loop整數時,您應該會遇到編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM