0
所以我有這個問題,我想調用我的程序與主函數參數(讓我們說我這樣稱呼:程序SIGQUIT)並通過此參數殺死(在代碼)和信號()函數。從程序參數傳遞的C++信號名稱
我好心問的問題是:我如何才能從char類型的argv [2]它包含「SIGQUIT」整數信號編號?
所以我有這個問題,我想調用我的程序與主函數參數(讓我們說我這樣稱呼:程序SIGQUIT)並通過此參數殺死(在代碼)和信號()函數。從程序參數傳遞的C++信號名稱
我好心問的問題是:我如何才能從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 "\n\tADD_SIGNAL(" $0 ")\n#endif" }'
請注意,納米的回答默默假定你正在使用'bash'作爲你的shell - 它不會與'dash'或由於輸出的不同格式的甚至'zsh'工作'殺-l'。 – user4815162342 2013-03-24 21:13:33