0

この短い質問: SIGTERM を受け取って終了した場合、どのように FIFO ファイルを閉じますか。私のファイルが通常のファイルであれば、動作します。ただし、FIFO の場合は機能しません。何か案は?ありがとう :)

/**
    with the help of these guys, 
    it is not a good approach to write it, 
    though it works. close(fd) is pointless here.
**/

    FILE * myfile;
    int fd;
    void sig_handler(int signum) {
        if (signum == SIGTERM) {
            *close(fd);*
            fclose(myfile);
            printf("caught SIGTERM\n");
            exit(EXIT_SUCCESS);
        }
    }
    int main(void) {
        myfile = fopen("file", "w+");
        fd = open("myfifo", O_RDONLY);
        {
            struct sigaction act;
            memset(&act, 0, sizeof(act));
            act.sa_handler = sig_handler;
            sigaction(SIGTERM, &act, 0);
        }
        for(;;)
            pause();
        return 0;
    }
4

1 に答える 1

1

FIFO を開く前に、シグナル ハンドラを設定する必要があります。私のUnix FIFOは少し錆びています:)しかしopen、ピアがそれを開くのをブロックしていると思われます。したがって、プロセスを強制終了すると、実際にはループ内ではなく、ループ内で待機しているopenため、シグナルハンドラーはオフになりません。

別の注意としてfclose、シグナルハンドラーでは悪い考えです。I/O ライブラリ操作がシグナルによって中断された場合はどうなりますか? ライブラリは、シグナル ハンドラから再入可能ではありません。シグナルハンドラから使用できるのは、特定の「非同期セーフ」関数のみです。もう 1 つはexit、ライブラリ内で複雑なことを行う です。その多くは、非同期シグナル ハンドラからは安全ではありません。_exit代わりに関数を使用する必要があります。

プロセスをシグナルハンドラーから終了させて​​いる場合、メモリリークが発生したかどうかを心配することは無意味であり、「正しく」取得することは不可能です。1 つには、mallocそれ自体がシグナル ハンドラーによって中断される可能性があります。free何かを解放するために呼び出すのは安全ではありません。

于 2013-06-10T01:52:02.350 に答える