繁体   English   中英

为什么我无法检索从反引号中暂停的程序?

[英]Why can't I retrieve my program that was suspended from inside backticks?

我创建了一个程序,它接受一个参数列表,并将它们放在一个新 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命令将其放回原处。

我的问题是,当我将命令放在反引号之间并尝试挂起它时,它会卡住而不返回提示。

不得不提一下,我把grid的所有内容都写在/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进程组中的所有进程发送SIGTSTP 至少在bashzsh ,命令替换$(<command>)中的命令在子shell中执行,但它们没有自己的进程组(它们与父shell本身在同一进程组中运行)。 这意味着CTRL + Z根本不应该影响它们 - 按下它并没有任何反应,就像在 shell 提示中按下CTRL + Z不会做任何事情一样:在这两种情况下,都没有要挂起的前台进程组!

我认为你在寻找在讨论这个问题的变化这一问题

将命令放在反引号中不仅仅是运行它的另一种方式; 它告诉 shell 在子 shell 中运行该命令并替换结果。 这称为命令替换,也可以表示为$(command) (这种语法更现代,通常更受欢迎)。

命令 susbtitution 的主要用途是它允许您使用一个命令的输出作为另一个命令的输入。 例如,查看这些命令的结果:

echo "1 + 1 = $(expr 1 + 1)" # prints "1 + 1 = 2"
echo "2 + 2 = `expr 2 + 2`"  # prints "2 + 2 = 4"
echo "1 + (4 / 2) = $(expr 1 + $(expr 4 / 2))" # prints "1 + (4 / 2) = 3"

当您使用命令替换代替命令本身时,扩展仍然有效,尝试运行命令并将其输出包含在 shell 的输入中。 因此,当您在替换中运行您的命令时,它会尝试运行您的命令,获取其所有输入,然后应尝试运行它作为结果打印的任何内容。

我不确定当你尝试挂起这些时会发生什么,但我的测试给出了一些不寻常的行为:尝试挂起$(cat)什么也没做,但是挂起$(rlwrap cat)崩溃了,并且在我杀死后让终端感到困惑它。 但是我知道子shell 不与实际的shell 作业一起管理,因此您将无法管理在子shell 中运行的命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM