gpt4 book ai didi

c - 如何使用 libreadline 处理 Ctrl-D

转载 作者:IT王子 更新时间:2023-10-29 01:06:29 25 4
gpt4 key购买 nike

我用 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 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-d 时,程序尝试将命令与“exit”或“quit”进行比较,然后我收到一个段错误。

有人知道我该如何处理吗?

最佳答案

您没有检查 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. */
}

关于c - 如何使用 libreadline 处理 Ctrl-D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22107346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com