【问题标题】:Invisible text in terminal after killing subprocess杀死子进程后终端中的不可见文本
【发布时间】:2019-08-19 17:19:46
【问题描述】:

我们以这个sn-p为例:

#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 秒后终止它。

问题是,如果我用 args top 3 调用它,它会正确启动 top 并在 3 秒后终止,但我留下了一个带有不可见文本的工作 shell:我可以输入和执行命令,但输入的文本没有'在运行 reset 之前不显示在屏幕上。

对正在发生的事情有任何见解吗?

【问题讨论】:

  • OT:错误情况(pid
  • OT:关于:int pid = fork(); 这应该是:pid_t pid = fork();
  • OT:在此声明之后:execlp(argv[1], argv[1], NULL); 应该有:perror( "execlp failed" ); exit( EXIT_FAILURE );
  • OT:此语句:return 0; 永远不会被执行,除非在调用 fork() 时出现错误,但当前代码无法让用户知道错误
  • @user3629249 你说的都是对的。我删除了一些代码以突出显示主要逻辑,不要认为错误处理与问题相关。对主要问题有任何想法吗?

标签: c multithreading terminal


【解决方案1】:

top 将终端设置为不回显输入的模式(请参阅man noechoman tcsetattr)。如果top 干净地退出,例如当您交互按“q”时,它会将其重置为正常模式。但是您的程序将其杀死,因此终端处于无回显模式。

【讨论】:

  • 附带说明,一次运行 3 个 ncurses 程序可能会在终端中触发意外/未定义的行为,因为所有 3 个将发送控制序列来更改终端状态。
  • 其实(看 Debian),top 是一个 termcap 应用程序(它不使用 ncurses 来改变终端模式,而只是用于移动光标)。
  • 感谢@ThomasDickey 指出这一点,我的回答更笼统一些,并添加了对tcsetattr 的引用。
猜你喜欢
  • 2011-09-23
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多