C:接收到信号时出现分段错误
C: Segmentation fault when signal received
我正在尝试编写一个基本的 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);
希望这已经足够清楚了。这是在一个循环的开始,它正在寻找输入作为命令执行,打印出提示(日期和时间#)。这些命令大部分工作但偶尔会丢失,我认为这可能与此信号处理错误有关。
提前致谢。
无限循环可能会发生段错误
你有可能在这里无限循环:
... }while (line[n] != '\n');
建议检查的不仅仅是 \n
字符。
例如,您可以使用 strstr(line, "\n");
在进入循环之前验证是否存在换行符。
将您的代码更改为
int check_redirect(char *line, int flag, int len)
{
int n = 0;
if (line != NULL)
{
do
{
if (line[n] == '>')
{
flag = 1;
}
n++;
}
while ((line[n] != '\n') && (n<len))
}
return (flag);
}
调用它:
flag = check_redirect(line, flag, read);
我正在尝试编写一个基本的 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);
希望这已经足够清楚了。这是在一个循环的开始,它正在寻找输入作为命令执行,打印出提示(日期和时间#)。这些命令大部分工作但偶尔会丢失,我认为这可能与此信号处理错误有关。
提前致谢。
无限循环可能会发生段错误 你有可能在这里无限循环:
... }while (line[n] != '\n');
建议检查的不仅仅是 \n
字符。
例如,您可以使用 strstr(line, "\n");
在进入循环之前验证是否存在换行符。
将您的代码更改为
int check_redirect(char *line, int flag, int len)
{
int n = 0;
if (line != NULL)
{
do
{
if (line[n] == '>')
{
flag = 1;
}
n++;
}
while ((line[n] != '\n') && (n<len))
}
return (flag);
}
调用它:
flag = check_redirect(line, flag, read);