【问题标题】:Signal sender conversion信号发送器转换
【发布时间】:2016-04-25 18:03:07
【问题描述】:

我正在尝试用 C++ 编写一个程序,该程序将信号发送到另一个程序,就像在 Linux 中使用 kill 命令一样,但我似乎遇到了一些转换问题。正如我所看到的,我不能只通过终端将信号作为字符串(SIGINTSIGUSR1 等)传递并在程序内部轻松转换它们。我也无法通过将他们作为他们的通讯员ints(2,30 等)传递并直接使用系统调用来实现我的目标。这是我的代码:

将信号作为 int 类型传递

#include <iostream>
#include <csignal>
#include <unistd.h>
#include <cstdlib>

using namespace std;


int main (int argc, char* argv[]) {
    int pid = atoi(argv[1]);
    int signal = atoi(argv[2]); //passing signals directly as int 

    cout << signal << endl;

    int error = kill(pid, signal);

    if(error !=0)
        cout << "Error sending signal to catcher program."<< endl;
    return 0;
}

输出

~$./signal_sender 5977 2
2
Error sending signal to catcher program.

至于当我尝试使用字符串时,我找不到可以正常工作的转换。

提前致谢。

【问题讨论】:

  • 你从kill()得到的errno是什么?
  • ESRCH 3 /* No such process */ 所以我想我向错误的 pid 发送信号。通过更正它,我让它通过整数工作,但在传递字符串时仍然没有运气。
  • 在下面查看我的完整答案。

标签: c++ linux signals system-calls


【解决方案1】:

两个最可能的错误原因是:

  • 没有给定pid的进程;
  • 您无权向进程发送信号。

要确定它是什么,请在调用 kill() 失败后打印并检查 errno 的值。请参阅 man page 以获取您可以从 kill() 获得的 errno 值列表。

关于将信号名称转换为数字,请参阅How to convert signal name (string) to signal code?(简而言之,您很可能必须拥有自己的信号名称和对应数字表。)

【讨论】:

  • 这是第一个。我得到了 errno #3(没有这样的过程)。直接传递信号 int 代码时似乎有效,但字符串转换仍然没有运气。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-01-08
  • 2015-05-06
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
相关资源
最近更新 更多