如何使用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返回的值.从手册页:
所以也许在使用之前检查NULL? str_command = readline(PROMPT); if (!str_command) { printf("EOF" /* And probably break. */ } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |