c - 为什么我无法检索从内部反引号暂停的程序?
问题描述
我创建了一个程序,它接受一个参数列表并将它们放在一个新 tty 上的网格中,我可以在其中移动并从中选择我想要的。
当我像这样运行没有反引号的程序时......
$> ./ft_select arg_1 arg_2 ... arg_N
打开一个新的 tty 并显示一个网格...
arg_1 arg_2 arg_3
arg_4 arg_5 arg_6
arg_7 ... arg_N
我点击ctrl+z了,程序毫无问题地被挂起,fg
命令将其放回原处。
我的问题是,当我将命令放在反引号之间并尝试暂停它时,它会卡住而没有给出提示。
不得不提的是,我把网格的所有内容都写在/dev/tty
您可以在下面的代码中找到执行信号处理的函数。
23 void signalhandler(int sig)
24 {
25 // struct winsize ws;
26
27 if (sig == SIGWINCH)
28 {
29 // ioctl(g_data->tty, TIOCGWINSZ, &ws);
30 update_data(g_data);
31 print_args(g_data);
32 update_cursor(g_data, 1);
33 }
34 else if (sig == SIGTSTP)
35 {
36 signal(SIGTSTP, SIG_DFL);
37 enable_cap("te");
38 modify_main_caps(SET, g_data->tty);
39 ioctl(g_data->tty, TIOCSTI, "\032");
40 }
41 else if (sig == SIGCONT)
42 {
43 signal(SIGTSTP, signalhandler);
44 modify_main_caps(UNSET, g_data->tty);
45 update_data(g_data);
46 print_args(g_data);
47 update_cursor(g_data, 1);
48 }
49 else if (sig == SIGINT)
50 {
51 enable_cap("te");
52 modify_main_caps(SET, g_data->tty);
53 exit(EXIT_FAILURE);
54 }
55 }
解决方案
CTRL+Z使终端设备驱动程序SIGTSTP
向前台进程组中的所有进程发送 a。在bash
andzsh
中,至少,命令替换$(<command>)
中的命令在子 shell 中执行,但它们没有自己的进程组(它们与父 shell 本身在同一进程组中运行)。这意味着CTRL+Z根本不应该影响它们 - 按下它并没有任何反应,就像在 shell 提示符下按下CTRL+Z不会做任何事情:在这两种情况下,都没有要挂起的前台进程组!
推荐阅读
- jmeter - Jmeter中的线程号
- amazon-web-services - 弹性搜索 403 请求因请求过多而受到限制 /_bulk
- javascript - react redux中如何结合reducers获得嵌套树状态
- java - 为什么 LocalDateTime 的时间部分在使用 JPA 将其保存到数据库后会更改其值?
- java - 如何将此 Java For Each 循环转换为常规 For 循环?
- javascript - 如何在邮递员中遍历以下 xml 响应以使用循环实现所有大陆?
- mysql - 获取mysql中基于3年的调度数据
- python - 即使使用用户代理,Python 也会请求错误 403
- python - 尽管输入了正确的数字,但获得的参数数量无效
- php - 如何使 Laravel 与多个表建立雄辩的关系?