【问题标题】:C unix: sending a signal to a process with kill isn't the same that from keybord..why?C unix:向带有kill的进程发送信号与从keybord不同..为什么?
【发布时间】:2013-09-05 00:50:46
【问题描述】:

所以我有这个父进程 A,它分叉并创建一些进程 B 和 C。C 本身会创建更多,但我认为这并不重要。

一个叉子:

char *argv_exec[] = {
    "/usr/bin/xfce4-terminal",
    "--geometry",
    "160x48",
    "-x",
    "./tv",
    NULL };

pid_tv = fork();

if (pid_tv == 0)
{   
    (void) execv(argv_exec[0], argv_exec);
    fprintf (stderr, "Errore nella execv.\n%s\n",
    strerror(errno) );
    anelito(0);
} 

虽然它们都一起运行,但我希望能够从进程 B 向其父进程 A 发送信号以使他执行某些操作 - 在这种情况下,杀死所有子进程并重新分叉。

进程 A 在消息中将其 pid 发送给进程 B。

父 A 处理信号:

if(signal(SIGQUIT,riparti)==SIG_ERR)
    ...
    void riparti(int s)
    { 
               kill_all_children();
               fork_all_children_again();
    }

当进程 B 收到一个 SIGQUIT 时,它会向 A 发送一个 SIGQUIT(它会反弹它) 进程 B 有:

signal(SIGQUIT,riparti);

void riparti(int a)
    {
          kill(pid_parent,SIGQUIT);
    }

现在,当我在进程 B 的窗口上按一次 CTRL+\ 时,一切顺利。 如果我再做一次,进程 A 似乎不再收到信号了。

【问题讨论】:

  • 添加用于分叉的代码。
  • 我不确定,它应该可以工作
  • 这很奇怪,我可以从子窗口和实际父窗口(正如我所期望的那样)发送带有 Ctrl+\\ 的 SIGQUIT 但是一旦我这样做了另一个 Ctrl+\ \ 我按似乎不再起作用了;字符 ^\\ 打印在屏幕上,但没有任何反应。我还检查了 sigpending() 并且在第一个之后没有发送任何信号!

标签: unix signals handler kill


【解决方案1】:

我认为您正在从 fork 代码之外杀死父进程,实际上您是从进程 A 发送该信号,这反过来会杀死父终端。

【讨论】:

  • 好的,谢谢!没错,我调用的实际命令是 /usr/bin/xfce4-terminal ,它反过来调用程序......但是现在我将父 (A) pid 传递到消息中,我只能使用该信号一次。我将编辑更多详细信息的主要消息
猜你喜欢
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多