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);