2016-03-22 34 views
0

我正在尝试编写一个基本shell程序,该程序在EOF中退出并处理SIGINT而不退出。它在一个无功能的c文件中工作,但是在创建函数时,我碰到一个错误,EOF和SIGNINT会导致seg错误。我不确定是什么导致了这种情况,并希望有人会发现我没有的东西。下面是我认为导致这个问题的函数,它是在Shell读取命令(或者我正在应用信号的地方)之后完成的第一件事。C:收到信号时出现分段错误

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性格比较:

+2

如果发生什么'line'没有一个换行符? – FredK

+0

@FredK该行不会被提交,除了EOF字符的情况。如果有\ n这行是通过检查来检查它是否是重定向或cd命令,否则将使用strtok进行拆分并在执行系统调用中使用 – BitFlow

+0

创建“行”的位置/方式? – ryyker

回答

0

赛格故障可从一个无限循环 你有潜力,这里的无限循环发生。

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

+0

可能是'\ 0'检查是否合适? – BitFlow

+0

@BitFlow是的,可以使用。字符串最终会结束。 – ryyker

+0

这似乎已修复,谢谢 – BitFlow

0

更改您的代码以

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