【问题标题】:Using ncurses in conjunction wth execvp将 ncurses 与 execvp 结合使用
【发布时间】: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 的输出来了解正在发生的事情。

标签: c fork ncurses execvp


【解决方案1】:

我假设您已经回答了您的问题,但无论如何我都会回复。

如果对execvp 的调用成功,那么它之后的任何代码都不会执行。请参阅execvp 的文档并查看它在调用时对进程的映像空间的作用。

我目前正在编写自己的 shell,我已经通过将我的 reset_shell_code 调用放在我调用 fork 之前和我的 wait 调用之后让它工作。当我用 man 或其他接管窗口但其他命令只需修改窗口工作时调用 execvp 时,发生了一些奇怪的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2012-07-16
    • 2019-08-15
    • 2018-10-03
    • 2017-04-15
    相关资源
    最近更新 更多