加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用libreadline处理Ctrl-D

发布时间:2020-12-16 09:50:51 所属栏目:百科 来源:网络整理
导读:我在C中构建一个程序,它是一个控制台,我使用libreadline来帮助我构建这个控制台.一切正常,但是当我收到一个ctrl-d时,我得到一个分段错误. 我可以弄清楚如何处理这个,我曾尝试使用signal.h来做到这一点,但不起作用. 下面是我的一段代码. int init_console(cha
我在C中构建一个程序,它是一个控制台,我使用libreadline来帮助我构建这个控制台.一切正常,但是当我收到一个ctrl-d时,我得到一个分段错误.

我可以弄清楚如何处理这个,我曾尝试使用signal.h来做到这一点,但不起作用.

下面是我的一段代码.

int init_console(char * ip,int port) {
/** Variaveis que ser?o utilizadas */
char * str_command;
char * filename = malloc(100);
Client * cli = malloc(sizeof (Client));

/** Monta o filename do arquivo de histórico */
strcpy(filename,getenv("HOME"));
strcat(filename,HISTORY_FILE);

/** Inicializa o histórico de comandos */
using_history();

/** Inicializa o readline */
rl_initialize();

/** Seta o número de comandos a serem guardados */
stifle_history(10);

/** Habilita o auto completation */
rl_inhibit_completion = true;

/** Cria o arquivo de historico */
if (access(filename,F_OK) != 0) {
    /** Se  o arquivo n?o existe,ent?o cria ele */
    create_history_file(filename);
} else {
    /** Le o arquivo de histórico */
    read_history(filename);
}

/** Conecta com o server */
strcpy(cli->ip,ip);
cli->port = port;

if (connect_server(cli) == CONNECT_FAILED) {
    /** Falha ao conectar,retorna erro */
    return -1;
}

/** Pega o primeiro comando */
while (true) {
    /** Pega o comando */
    str_command = readline(PROMPT);

    /** Adiciona no histórico */
    add_history(str_command);

    /** Verifica se o comando é o exit pra sair */
    if (strcmp(str_command,"exit") == 0 || strcmp(str_command,"quit") == 0) {
        /** Escreve o arquivo de histórico */
        write_history(filename);

        /** Fecha a conex?o */
        close_server_connection(cli);

        /** Lib era memória */
        free(cli);

        /** Sai do loop */
        break;
    }

    /** Faz o encode */
    strcpy(cli->command,encode_command(str_command));

    /** Envia para o server */
    if (send_command(cli) == SEND_COMMAND_FAILED) {
        /** Falha ao enviar o comando */
        fprintf(stderr,"N?o foi possível executar o comandon");
    }

    /** Espera a resposta */
    if (recv_response(cli) == RECV_RESPONDE_FAILED) {
        /** Informa qual foi o erro */
        fprintf(stderr,"N?o foi possível receber a resposta do socketn");
    } else {
        /** Imprime qual foi o resultado */
        printf("%sn",cli->response);
    }
}

return 0;

}

当我按下ctrl-d,并且程序尝试将命令与“exit”或“quit”进行比较时,我收到一个seg错误.

有人知道我该怎么办呢?

解决方法

您没有检查readline返回的值.从手册页:

If EOF is encountered while reading a line,and the line is empty,NULL is returned.

所以也许在使用之前检查NULL?

str_command = readline(PROMPT);
if (!str_command) {
    printf("EOF"
    /* And probably break. */
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读