空白线段。错(写自己的壳)

时间:2015-11-13 06:41:49

标签: c shell

我还在学习编写简单的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任何建议。谢谢。

1 个答案:

答案 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错误。