【发布时间】:2015-11-13 06:41:48
【问题描述】:
我还在学习编写简单的 shell。
我希望这个 shell 允许空行和 cmets。
我做了一些编码,遇到了一个问题,如果我直接输入enter(空白行),它会直接seg.fault core dumped。
我不知道到底哪里出错了,因为我打印了所有内容,一切看起来都很好。我在这行中唯一怀疑的事情
if (args[0] == NULL || !(strncmp(args[0],"#",1))) {
exitstat = 0;
}
我从基本的 split 命令函数中得到了参数。奇怪的是 cmets 工作得很好。
下面是我的函数,用于读取用户输入并拆分它们(如果我没记错的话,进行标记)。它们非常基础,因为我是从互联网教程中学习这些功能的。
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 的 if 条件的任何建议。谢谢。
【问题讨论】:
-
你也应该检查realloc的返回值,它并不总是成功
-
你能分享你的完整代码,它有 main() 来测试这些功能吗?
-
@cm161 是的,我刚刚编辑了帖子
-
这个
!(strncmp(args[0],"#",1)可以简化为args[0] == '#'。附带说明一下,在 shell 中,#是注释,即使它不是该行中的第一个字符。ls -l # echo hi产生目录列表,但echo hi永远不会在有或没有;分隔符的情况下执行。 -
args在哪里获取它的值?是main()的第二个参数吗?不应该是int main(int argc, char **args)吗?