Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:接收到信号时出现分段故障_C_Unix_Segmentation Fault_Signals_Signal Processing - Fatal编程技术网

C:接收到信号时出现分段故障

C:接收到信号时出现分段故障,c,unix,segmentation-fault,signals,signal-processing,C,Unix,Segmentation Fault,Signals,Signal Processing,我正在尝试编写一个基本shell程序,该程序在EOF时退出,并在不退出的情况下处理SIGINT。它在一个没有函数的c文件中工作,但在创建函数时,我遇到了一个错误,其中EOF和SIGNINT会导致seg故障。我不确定是什么原因造成的,希望有人能发现我没有发现的东西。下面是我认为导致问题的函数,它是Shell读取命令(或我应用信号的位置)后所做的第一件事 这是调用函数的地方: char buffer[15]; time_t now = time(NULL); strftime(buffer, 15

我正在尝试编写一个基本shell程序,该程序在EOF时退出,并在不退出的情况下处理SIGINT。它在一个没有函数的c文件中工作,但在创建函数时,我遇到了一个错误,其中EOF和SIGNINT会导致seg故障。我不确定是什么原因造成的,希望有人能发现我没有发现的东西。下面是我认为导致问题的函数,它是Shell读取命令(或我应用信号的位置)后所做的第一件事

这是调用函数的地方:

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);
希望这足够清楚。这是一个循环的开始,该循环在打印出提示(日期和时间#)后,寻找要作为命令执行的输入。这些命令大部分工作正常,但偶尔会丢失,我认为这可能与信号处理错误有关


提前感谢。

Seg故障可能发生在无限循环中 这里有无限循环的可能性:

... }while (line[n] != '\n');
建议检查不仅仅是
\n
字符

您可以使用
strstr(行“\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);
}

如果
line
没有换行符会发生什么情况?@FredK该行不会提交,除非是EOF字符。如果有一个\n行是take,通过检查看它是否是redirect或cd命令,否则使用strtok解构,并在执行系统调用中使用。在何处/如何创建
line
行?@ryker行被创建为空指针,如下所示
char*line=NULL在循环外部,在main内部,您可能有一个无限循环,正如@FredK所暗示的那样。除了EOF字符外,…是否绝对排除了在不使用
\n
的情况下提交行的可能性?
\0
检查是否合适?@BitFlow是的,可以使用。这根绳子最终会结束的。
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);