Переписываю шелл на C и столкнулся с проблемой.
При написании команды — например, echo "this
— мы получили новое приглашение («dquote>», в zsh), и мы можем выйти из него с помощью «Ctrl + c» и вернуться к нашей последней командной строке.
я застрял там; Я просто не могу выйти из своей функции чтения (послушайте «dquote>»), я пытался записать на стандартный вывод EOF при нажатии «ctrl + c», но он не читает его.
Я переключился на неканонический режим. Я ловлю сигнал с signal(SIGINT, sig_hand);
затем я выполняю эту часть кода, когда сигнал пойман:
static void sig_hand(int sig)
{
if (g_shell.is_listen_bracket) // if is the first prompt or no
putchar(4); // EOT
else
{
putstr("\n");
print_prompt();
}
}
и моя функция чтения:
int j;
char command[ARG_MAX];
char buff[3];
j = -1;
while (1)
{
bzero(buff, 3);
read(0, buff, 3);
if (buff[0] == 4 && !buff[1] && !buff[2])
return (ctrl_d(shell));
else if (isprint(buff[0]) && !buff[1] && !buff[2]) // if is between 32 and 126 (ascii)
{
command[++j] = buff[0];
putchar(buff[0]);
}
}
command[++j] = '\0';
return (strdup(command));
Итак, мой код ожидает «read (0, buff, 3);», и я хочу выйти из него при нажатии ctrl + c.
Спасибо за помощь !
read(0, buff, 3)
может возвращать {-1,0,1,2 или 3} Обрабатывать все случаи. Также:command[++j] = buff[0];
должно минимум бытьcommand[j++] = buff[0];
(плюс вы можете зациклить на 'j' до возвращаемого значения, которое вы получили отread()
) - person wildplasser   schedule 22.03.2017