Невидимый текст в терминале после уничтожения подпроцесса - PullRequest
1 голос
/ 28 марта 2019

Давайте возьмем этот фрагмент в качестве примера:

#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char const *argv[]) {
    int pid = fork();
    if (pid == 0) { // Child
        execlp(argv[1], argv[1], NULL);
    } else if (pid > 0) { // Parent
        int n = atoi(argv[2]);
        sleep(n);
        kill(pid, SIGKILL);
        int status;
        wait(&status);
        ...
        exit(0);
    }
    return 0;
}

После запуска с main [command] [seconds] программа должна создать подпроцесс для выполнения данной команды и завершить его через n секунд.

Проблема в том, что если я вызываю его с аргументами top 3, он корректно начинает top и завершается через 3 секунды, но у меня остается рабочая оболочка с невидимым текстом: я могу набирать и выполнять команды, но набранный текст не не будет отображаться на экране до тех пор, пока не будет запущен reset.

Любое понимание того, что происходит?

1 Ответ

1 голос
/ 29 марта 2019

top устанавливает терминал в режим, в котором он не выводит эхо-сигнал (см. man noecho или man tcsetattr). Если top завершает работу чисто, например, когда вы нажимаете «q» в интерактивном режиме, он сбрасывает его в обычный режим. Но ваша программа убивает его, поэтому терминал остается в режиме без эха.

...