首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用libreadline处理Ctrl

如何使用libreadline处理Ctrl
EN

Stack Overflow用户
提问于 2014-02-28 22:52:04
回答 1查看 2.2K关注 0票数 3

我用C语言构建了一个程序,它是一个控制台,我使用libreadline来帮助我构建这个控制台。一切都很好,但是当我收到一个ctrl-d时,我会得到一个分段错误。

我可以想出如何处理这个问题,我曾经尝试过使用signal.h来完成这个任务,但是不起作用。

下面是我的一段代码。

代码语言:javascript
复制
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 comando\n");
    }

    /** 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 socket\n");
    } else {
        /** Imprime qual foi o resultado */
        printf("%s\n", cli->response);
    }
}

return 0;

}

当我按下ctrl,并且程序试图将命令与“退出”或“退出”进行比较时,我就会收到一个seg错误。

有人知道我该怎么处理这事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 22:54:14

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

如果读取一行时遇到EOF,且该行为空,则返回NULL。

那么,在使用NULL之前,可以检查一下它吗?

代码语言:javascript
复制
str_command = readline(PROMPT);
if (!str_command) {
    printf("EOF"
    /* And probably break. */
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22107346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档