shell程序中的分段错误

时间:2012-10-03 12:51:29

标签: c shell segmentation-fault

我一直在尝试创建自己的shell程序,我一直在寻找的教程建议使用 strtok()函数。虽然,我无法简单地解析我的命令行,但我不确定我做错了什么。在 parseCmd()函数中首次使用 strtok()时,我一直收到细分错误

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#define MAXSIZE 512

int parseCmd(char *cmd, char *args[])
{
    printf("LOGGER: parseCmd(cmd=%s, args=%p)\n", cmd, args);

    char cmdDelims[] = " >";

    char *cmdReader;
    cmdReader = strtok(cmd, cmdDelims);

    printf("LOGGER: cmdReader=%s\n", cmdReader);

    int i = 0;
    while (cmd != NULL)
    {
        printf("LOGGER: %d counter", i);

        args[i] = strdup(cmdReader);
        cmdReader = strtok(NULL, " >");
        i++;
    }
}

int main() 
{   
    char *in;
    in = malloc(MAXSIZE);

    char *args[10];
    char *cmd = NULL;

    int errorBit = 0;
    int terminationBit = 1;

    char inDelims[] = "\n";

    while (terminationBit)
    {
        printf("mysh>");
        fgets(in, MAXSIZE, stdin);

        cmd = strtok(in, inDelims);

        errorBit = parseCmd(cmd, args);
        if (errorBit)
        {
            fprintf(stderr, "Error: Cannot parse command %s\n", cmd);
            exit(1);
        }

        if (*args == "exit")
        {
            terminationBit = 0;
        }
    }
    return 0;
}

非常感谢您对此主题的任何帮助或建议。

编辑: 根据输出, segfault实际可能不是strtok()

以下是一些输出:

mysh>hi sup
LOGGER: parseCmd(cmd=hi sup, args=0x7fff50ec0b80)
LOGGER: cmdReader=hi
Segmentation fault: 11

1 个答案:

答案 0 :(得分:1)

似乎是一个简单的错误:

while (cmd != NULL)
{
    // ...
}

......应该是:

while (cmdReader != NULL)
{
    // ...
}

...因为cmd很可能永远不会成为NULL。另外,这个:

if (*args == "exit")
{
    terminationBit = 0;
}

......可能不会按照你的想法去做。要比较字符串,请使用:

if (strcmp(*args, "exit") == 0)
{
    terminationBit = 0;
}

您必须确保parseCmd也返回一些内容,否则请执行以下操作:

errorBit = parseCmd(cmd, args);

... parseCmd会产生未定义的行为,因此errorBit的值也是完全未定义的,后续检查其值的条件也是如此。

最后,您的程序实际上会泄漏内存,因为您strdupmalloc并且永远不会自由。完成free后,请不要忘记args