【问题标题】:C: Segmentation fault when signal receivedC:收到信号时出现分段错误
【发布时间】: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


【解决方案1】:

Seg 错误可能发生在无限循环中 你有可能在这里无限循环:

... }while (line[n] != '\n');

建议检查的不仅仅是\n 字符。

例如,您可以在进入循环之前使用strstr(line, "\n"); 来验证换行符是否存在。

【讨论】:

  • \0 检查是否合适?
  • @BitFlow 是的,可以使用。字符串最终会结束。
【解决方案2】:

将代码更改为

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

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多