2013-03-24 34 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" }'