从程序参数传递的c++信号名

C++ signal names passed from program parameters

本文关键字:信号 c++ 程序 参数传递      更新时间:2023-10-16

所以我遇到了这个问题,我想用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" }'