为什么我不能找回我的计划,从里面反引号暂停?(Why can't I retrieve my

2019-10-29 10:59发布

我创建了一个程序,它的参数列表,并把它们在网格上了一个新的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 }

Answer 1:

CTRL + Z使终端设备驱动器到发送SIGTSTP所有进程前台进程组英寸 在bashzsh ,至少,命令在命令替换$(<command>)在子Shell被执行,但他们没有得到自己的工序组 (它们相同的处理组作为父壳本身在运行)。 这意味着, 按CTRL + Z应该不会影响他们在所有-按它,什么都不会发生,就像按下CTRL + Z在shell提示下没有做任何事情:在这两种情况下,没有前台进程组暂停!



Answer 2:

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

在反引号把一个命令不只是另一种方式来运行它; 它告诉运行在一个子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"

当你作为命令的使用命令替换本身的扩张仍然有效,尝试运行命令,包括其在外壳的输入输出。 所以,当你在一个替代运行命令,它会尝试运行命令的时间,把所有的输入,那么应该尝试运行任何它打印的结果。

我不完全相信,当您尝试暂停这些会发生什么,但我测试了一些不寻常的行为:试图暂停$(cat)什么也没做,但暂停$(rlwrap cat)坠毁,并离开码头困惑我杀了以后,它。 但我确实知道,次外层不与实际的外壳一起工作的管理,所以你无法管理你在子shell中运行命令。



文章来源: Why can't I retrieve my program that was suspended from inside backticks?
标签: c tty ctrl termcap