从curses进程分叉交互式程序会导致键盘干扰

问题描述 投票:0回答:1

从curses界面,用户可以分叉feh实例来查看图像。 curses 界面有

hjkl
导航,在查看图像时不应被阻止。

void display_file(void) {
    def_prog_mode();
    endwin();

    pid_t pid = fork();
    if (!pid) {
        execl("/usr/bin/feh", "feh", "/home/abc/main/violet.jpg", NULL);
    }

    reset_prog_mode();
    wrefresh(state_of_curses.a_win);
    wrefresh(state_of_curses.b_win);
}

这将打开 feh,当 feh 是活动窗口时,

hjkl
导航仅影响 feh(正常)。但是当curses终端处于活动状态时,所有键似乎都会随机发送到curses或feh(即
hjkl
可能会移动图像,而它应该只影响curses)。

为什么会这样?什么才是正确的方法才能达到预期的效果?

  • 如果我在后台运行 feh,程序就会按预期工作:
    execl("/bin/bash", "bash", "-c", "feh /home/abc/main/violet.jpg &", NULL);
c fork ncurses curses
1个回答
0
投票

Fork 为子进程提供与父进程相同的打开文件描述符。因此,任何发送到curses的角色也将被发送到feh。 防止写入到孩子的 STDIN 来解决问题。

void display_file(void) {
    def_prog_mode();
    endwin();

    pid_t pid = fork();
    if (!pid) {
        int fd = open("/dev/null", O_RDONLY);
        dup2(fd, STDIN_FILENO);
        close(fd);
        execl("/usr/bin/feh", "feh", "/home/abc/main/violet.jpg", NULL);
    }

    reset_prog_mode();
    wrefresh(state_of_curses.a_win);
    wrefresh(state_of_curses.b_win);
}
© www.soinside.com 2019 - 2024. All rights reserved.