2013-03-24 49 views
0

所以我有这个问题,我想调用我的程序与主函数参数(让我们说我这样称呼:程序SIGQUIT)并通过此参数杀死(在代码)和信号()函数。从程序参数传递的C++信号名称

我好心问的问题是:我如何才能从char类型的argv [2]它包含“SIGQUIT”整数信号编号?

+0

请注意,纳米的回答默默假定你正在使用'bash'作为你的shell - 它不会与'dash'或由于输出的不同格式的甚至'zsh'工作'杀-l'。 – user4815162342 2013-03-24 21:13:33

回答

1

为什么你不只是建立以字符串和相应的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 "\n\tADD_SIGNAL(" $0 ")\n#endif" }' 
相关问题