我正在尝试用C创建自己的shell,但是我遇到了strtok的问题。我使用它来正确地解析输入中的命令和参数,但我无法解析路径(它目前是段错误)。一旦我正确解析了路径,我应该能够在每个部分上调用execlp并相应地进行fork处理。任何见解将不胜感激,代码如下。如果您认为我可以做得更好,也可以随意评论风格选择。
#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++;
}
}
答案 0 :(得分:5)
您正在设置指向只读内存位置的路径,并且当strtok
尝试对其进行标记时,调用strtok
可能是导致问题的原因(即写入空字符)在它里面的某个地方)。
您可能需要以下内容:
char path[1024];
并致电strcpy
,如:
strcpy(path, getenv("MYPATH"));
和
strcpy(path, "/bin#.");
我强烈建议您阅读C中的字符串处理。
答案 1 :(得分:2)
以下不会产生预期的效果
path = "/bin#.";
请尝试strcpy( path, "/bin#." );
。
并且,正如larsmans所说,修复malloc,以便为命令的大小分配足够的字节。
另外,如果它的C是你正在严格编译的,那么你在声明你所在位置的loop
整数时应该有一个编译错误。