1

Linuxでシグナル名をその番号で出力する必要がありますが、strsignal(9)はsignal( "Killed")の説明を返しますが、名前は返しません-SIGKILL。ソースコードに事前定義された配列を挿入する以外に、そのような名前を取得する方法はありますか?

4

2 に答える 2

1

標準的な機能は思いつかない。スクリプトを使用して関数を生成できます。

echo "#include <signal.h>" |\
  g++ -E -dD -xc++ - |\
  awk '$2~/^SIG[A-Z]/ && $3~/[0-9]+/ { print "case "$2": return \""$2"\";" }' \
  > signal_to_str_cases.inc

そしてコードで:

#include <signal.h>

char const* signal_to_str(int signo) {
    switch(signo) {
    #include "signal_to_str_cases.inc"
    default: return "<unknown signo>";
    }
}
于 2012-11-22T13:57:09.970 に答える
0

上記のスクリプトウェイソリューションは確かに優れていますが、同じ番号の信号が複数ある場合は問題があります。この場合、コードはコンパイルされず、「大文字と小文字の値が重複しています」などのエラーが発生します。これを修正する1つの方法は、繰り返される値のケー​​スを生成しないことです。

echo "#include <signal.h>" |\
    g++ -E -dD -xc++ - |\
    awk '$2~/^SIG[A-Z]/ && $3~/[0-9]+/ && !seen[$3]++ { print "case "$2": return \""$2"\";" }' \
    > signal_to_str_cases.inc
于 2018-03-19T15:37:10.290 に答える