【发布时间】:2016-03-22 15:57:25
【问题描述】:
我正在尝试编写一个基本 shell 程序,该程序在 EOF 处退出并在不退出的情况下处理 SIGINT。它在一个无功能的 c 文件中工作,但是在创建函数时我遇到了一个错误,其中 EOF 和 SIGNINT 会导致段错误。我不确定是什么原因造成的,希望有人能发现我没有发现的东西。下面是我认为导致问题的函数,它是在 Shell 读取命令(或我正在应用信号的位置)后完成的第一件事。
int check_redirect(char *line, int flag)
{
int n = 0;
if (line == NULL) return (flag);
else
{
do
{
if (line[n] == '>') flag = 1;
n++;
}while (line[n] != '\n');
}
return (flag);
}
这是调用函数的地方:
char buffer[15];
time_t now = time(NULL);
strftime(buffer, 15, "[%d/%m %H:%M]", localtime(&now) );
fprintf(stdout, "%s # ", buffer);
signal(SIGINT, SIG_IGN);
read = getline (&line, &len, stdin);
signal(SIGINT, SIG_DFL);
flag = check_redirect(line, flag);
希望这已经足够清楚了。这是一个循环的开始,它正在寻找输入以作为命令执行,并打印出提示符(日期和时间#)。这些命令大部分工作但偶尔会丢失,我认为这可能与此信号处理错误有关。
提前致谢。
【问题讨论】:
-
如果
line没有换行符会怎样? -
@FredK 该行未提交,除非是 EOF 字符。如果有一个 \n ,则通过检查以查看它是重定向还是 cd 命令,否则使用 strtok 解构以分解并用于执行系统调用
-
line是在哪里/如何创建的? -
@ryyker 行被创建为像这样的 NULL 指针
char *line = NULL;在循环外,在 main 内 -
你可能有一个无限循环,正如@FredK 可能暗示的那样。 ...除了 EOF 字符 是否绝对排除在没有
\n的情况下可以提交行的可能性?
标签: c unix segmentation-fault signals signal-processing