0

したがって、メイン関数のパラメーターを使用してプログラムを呼び出したい場合にこの問題が発生し (たとえば、次のように呼び出したとします: program SIGQUIT )、このパラメーターをコード内の kill() および signal() 関数に渡します。

私が親切に尋ねている質問は、「SIGQUIT」を含むchar型argv [2]から整数のシグナル番号を取得するにはどうすればよいですか?

4

1 に答える 1

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" }'
于 2013-03-25T01:04:21.637 に答える