如何使用GNU Readline处理Ctrl + D.

时间:2016-12-19 19:37:43

标签: c shell readline

我正在尝试使用GNU Readline Library从stdin读取一行。我有两个主要问题(我认为):一个是PROMPT,另一个是处理Crtl + D(它应该退出minishell,但是会出现seg错误) 如何处理Ctrl + D以便它可以退出? 这是我使用readline()函数的代码:

char* readl(char* line){
    char* string="";
    char* pitos="";
    pitos=getenv("USER");
        strcat(pitos,PROMPT);
        strcat(pitos," ");
    while(strcmp(string,"")==0){


        //printf("%s%s ",getenv("USER"),PROMPT);
        string = readline (pitos);
    }
    if(!string){ #trying to exit when ctrld
        exit(0);
    }else{
        char* com = strchr(string,'#'); #ignore comments
        if(com!=NULL){
            *com=NULL;
        }
        add_history(string);
        strcpy(line,string);
        return string;
    }
}

2 个答案:

答案 0 :(得分:1)

char* pitos="";
pitos=getenv("USER");
    strcat(pitos,PROMPT);
    strcat(pitos," ");

pitos指向的字符串中只有1个字节可用(终止'\0'),并且写入它是未定义的行为。

答案 1 :(得分:0)

一个问题似乎是在strcmp()的结果上调用readline(),然后再将其测试为NULL。

试试这个:

while(string && strcmp(string,"")==0){
    ...