从程序参数传递的c++信号名
C++ signal names passed from program parameters
所以我遇到了这个问题,我想用main函数的参数调用我的程序(假设我这样调用它:program SIGQUIT),并将这个参数传递给代码中的kill()和signal()函数。
我善意地问的问题是:我如何从char类型argv[2]中获得包含"SIGQUIT"的整数信号数?
为什么不直接用字符串和相应的int
构建一个查找表呢?如果您只需要在您的系统上定义的信号,您将需要这样的内容:
#include <csignal>
#include <map>
#include <string>
#include <iostream>
#include <cassert>
int main(int argc, char *argv[]){
// lookup table
std::map<std::string, int> lookup_table;
#define ADD_SIGNAL(X) lookup_table.insert(std::make_pair(#X,X));
// standard signals
ADD_SIGNAL(SIGABRT);
ADD_SIGNAL(SIGFPE);
ADD_SIGNAL(SIGILL);
ADD_SIGNAL(SIGINT);
ADD_SIGNAL(SIGSEGV);
ADD_SIGNAL(SIGTERM);
// implementation specific signals
#ifdef SIGKILL
ADD_SIGNAL(SIGKILL);
#endif
#ifdef SIGSTOP
ADD_SIGNAL(SIGSTOP);
#endif
// ...
#undef ADD_SIGNAL
assert(argc > 1 && "No signal");
std::string sig = argv[1];
std::map<std::string, int>::iterator it = lookup_table.find(sig);
if(it != lookup_table.end())
std::cout << "Signal " << it->first << ": " << it-> second << std::endl;
else
std::cout << "Unknown signal " << sig << std::endl;
}
写所有的信号有点长,你可以使用这个命令行(假设POSIX)来生成它们:
kill -l | sed 's/[0-9]*)//g'
| grep -v "[+-]"
| xargs -n1 echo
| awk '{ print "#ifdef " $0 "ntADD_SIGNAL(" $0 ")n#endif" }'
相关文章:
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 有可能在信号处理程序中设置promise吗
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 在条件变量中触发错误信号的频率是多少
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- 升压信号2将插槽传递到成员功能以断开连接
- C++函数包装器来捕获某些信号
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- Qt将信号与另一个类方法连接
- C++ 信号和插槽不工作:插槽不响应事件
- Coursera :自动评分器的未知信号 11
- 阻塞信号会导致升压过程不起作用