0

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");
    }
}
4

0 に答える 0