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