【发布时间】:2021-06-06 13:26:27
【问题描述】:
我正在为一个类用 C 语言编写一个 shell 项目,我决定在 shell 中实现箭头键命令历史记录作为一项额外功能。调用initscr() 后,一切都正确打印出来了,但是当我在fork 内部调用execvp() 以执行shell 命令并在屏幕上显示结果时,事情变得有点古怪。我阅读了this post 并了解到为了避免 execvp 输出中的缩进,我可以使用reset_shell_mode(),后跟reset_prog_mode()。当我这样做时,execvp 命令打印正常,但如果 execvp 命令正常工作,reset_prog_mode() 似乎不能正常工作。这是一些演示问题区域的代码。
pid = fork();
if (pid == 0) {
reset_shell_mode();
execvp(command, args);
reset_prog_mode();
refresh();
printw("error"); // prints correctly
}
else {
usleep(1000);
waitpid(pid, &status, 0); // status is defined, just not in this snippet
reset_prog_mode();
refresh();
printw("completed"); // never prints - printw is scuffed from this point on. getstr() works tho.
}
我几乎可以肯定我的问题与 fork 以及在成功 execvp 完成后我放置 reset_prog_mode() 的位置有关,但我不知道如何解决它。
【问题讨论】:
-
你有一个终端和两个进程竞争改变终端模式(一场比赛)。您可以通过研究
strace的输出来了解正在发生的事情。