我还在学习编写简单的shell。
我希望这个shell允许空行和注释。
我做了一些编码,我遇到了一个问题,如果我直接输入enter(空白行),就直接将seg.fault核心转储。
我不知道错误的确切位置,因为我打印所有内容并且一切似乎都很好。我唯一怀疑这一行
if (args[0] == NULL || !(strncmp(args[0],"#",1))) {
exitstat = 0;
}
我从基本拆分命令功能获得了args。奇怪的是评论工作得很好。
下面是我的函数,用于读取用户输入和拆分它们(如果我没有记错,则标记为)。它们非常基础,因为我从互联网教程中学习这些功能。
char *commandInput() {
char *command = NULL;
ssize_t bufsize = 0;
getline(&command, &bufsize, stdin);
return command;
}
char **splitLine(char *command) {
int bufsize = 64,
int position = 0;
char **tokens = malloc(bufsize * sizeof(char*));
char *token;
token = strtok(command, DELIMITER);
while (token != NULL) {
tokens[position] = token;
position++;
if (position >= bufsize) {
bufsize += 64;
tokens = realloc(tokens, bufsize * sizeof(char*));
}
token = strtok(NULL, DELIMITER);
}
tokens[position] = NULL;
return tokens;
}
如果我输入空行,任何人都可以帮我识别是什么使它成为seg.fault?谢谢。
修改
我使用了调试器(经过几次试验后终于成功使用它),结果发现错误位于我不希望引起任何问题的行(参见--- UPDATE ----)。
他们处理我的commandInput函数是在main()
函数中,我写
int main () {
......
char * command = NULL
char **args;
command = commandInput();
args= splitLine(command);
------------------ UPDATE!(CAUSING ERROR IF STATEMENT) ---------------
background = 0
numbarguments = 0
// Condition to check whether there is a start program running in backgrond
if (!(strncmp(args[numbarguments - 1], "&",1))) {
background = 1;
args[numbarguments - 1] = NULL;
}
----------------------------------------------
if (args[0] == NULL || !(strncmp(args[0],"#",1))) {
exitstat = 0;
}
....... //(comparing the arguments other than null)
}
因此,如果条件导致我seg.fault任何建议。谢谢。
答案 0 :(得分:1)
您传递给splitline的参数已被修改。 strtok具有通过插入\ 0并返回指向子串的指针来修改它所获得的字符串的效果。 strtok返回的内容不是您可以直接存储以供以后使用的内容,而是您需要复制它。
token = strtok(command, DELIMITER);
while (token != NULL)
{
tokens[position] = malloc(strlen(token)+1);
strcpy(tokesn[position],token);
...
所以换句话说,将指针数组分配给字符串是不够的,还需要分配空间来保存用strtok标记的字符串。
代码
if (!(strncmp(args[numbarguments - 1], "&",1))) {
background = 1;
args[numbarguments - 1] = NULL;
}
看起来不对,numberarguments
最初为0,因此您要将args[-1]
与"&"
进行比较,然后再分配args[-1] = NULL
,这可能会导致seg错误。