WTERMSIG() はどのようにして 67 や 123 などの 63 より大きい値に評価できますか?
これがどのように起こるかです。popen() を使用して unbuffer を実行し、それによってシェル スクリプトが実行されます。コードの次のブロックは、NULL を受け取るまで、popen() によって返されたファイル記述子から読み取る while() ループです。この後に pclose() が続きます。
まれに、pclose() が値 != -1 を返し、WIFSIGNALED() を true に設定します。奇妙な点は、WTERMSIG() が 63 より大きい値 (67 や 123 など) に評価されることです。何が原因でしょうか?
シェル スクリプトはすべてのタスクを完了しているため、途中で中断されることはありません。1 ~ 31 (標準信号) または 32 ~ 63 (拡張リアルタイム信号) を理解できました。当社のプラットフォーム (Timesys Linux) でシグナル 67 または 123 を生成しようとすると、エラーが発生します。
関連するコードの一部を次に示します。
FILE* fp = popen(command.c_str(), "r");
if (fp == NULL) {
// Handle error
}
while (fgets(line, sizeof(line), fp) != NULL) {
// Do stuff with output of child process
}
pclose_status = pclose(fp);
pclose_errno = errno;
if (pclose_status != -1 && WIFEXITED(pclose_status)) {
// Happy ending, occurs 99% of the time
return (WEXITSTATUS(pclose_status)));
}
// Check if pclose returned an error. If so, log the result.
if (pclose_status == -1) {
// Log an error and pclose_errno
}
else {
if (WIFSIGNALED(pclose_status)) {
// This happens maybe 1% of the time, but the value
// printed is > 63.
Syslog::error("Child process terminated by signal %d",
WTERMSIG(pclose_status));
}
if (WIFSTOPPED(pclose_status)) {
// Hasn't happened.
Syslog::error("Child process stopped by delivery of signal %d",
WSTOPSIG(pclose_status));
}
if (WIFCONTINUED(pclose_status)) {
// Hasn't happened.
Syslog::error("Child process resumed by delivery of SIGCONT");
}
}