[英]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.