【问题标题】:how to handle Ctrl+D using GNU Readline如何使用 GNU Readline 处理 Ctrl+D
【发布时间】:2017-05-04 22:19:17
【问题描述】:

我正在尝试使用 GNU Readline 库从标准输入读取一行。我有两个主要问题(我认为):一个是提示,另一个是处理 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;
    }
}

【问题讨论】:

  • 您是否可以使用来自pitos=getenv("USER"); 的指针更改环境表?即使指针处的内存是可写的,你怎么知道concat 的入口是否有空间?您应该使用putenv 来修改环境变量。
  • 为什么要更改代码?无需使 cmets 和答案无效。只需更改您自己的代码,如果您仍然遇到问题,请提出另一个问题。与其沉迷于实时教程,不如走开思考问题。
  • 回滚。如果这会使答案无效,您不应该更改您的问题。随意添加更多信息,但不要更改现有文本的相关部分并适当地标记编辑。

标签: c shell readline


【解决方案1】:

一个问题似乎是您在测试 NULL 之前对 readline() 的结果调用了 strcmp()

试试这个:

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

【讨论】:

  • 我已经更新了代码,但是 CtrlD 不起作用。它仍然存在段错误
【解决方案2】:
char* pitos="";
pitos=getenv("USER");
    strcat(pitos,PROMPT);
    strcat(pitos," ");

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2012-10-30
    • 1970-01-01
    • 2023-03-24
    • 2016-12-19
    相关资源
    最近更新 更多