1

私は簡単なテストプログラムを持っています:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <pthread.h>

#include <linux/seccomp.h>
#include <sys/prctl.h>
#include <sys/syscall.h>

void *do_work(void *args) {
    prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
    printf("OK.\n");
}

int main() {
    pthread_t t;
    int ret;
    ret = pthread_create(&t, NULL, do_work, NULL);
    if (ret != 0) {
        printf("Could not create thread, error is %d.\n", ret);
        return 1;
    }
    ret = pthread_join(t, NULL);
    if (ret != 0) {
        printf("Could not join thread, error is %d.\n", ret);
        return 2;
    }
    printf("Program done.\n");
    return 0;
}

これは、Ubuntu 16.04 で何も出力せずにデッドロックします。seccomp のドキュメントを読んでも、なぜこのようなことが起こるのかわかりません。なぜですか?SIGKILL はプロセス全体を強制終了しませんか?

4

2 に答える 2

1

その理由はprintf機能です。

strace -fプログラムを (行なしで)実行prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);すると、作成されたスレッドがfutexシステム コールを呼び出すことがわかります。

への呼び出しfutexはモードによって禁止されているseccompため、スレッドが強制終了され、pthread_join無期限に待機します。

に置き換えるprintf()write(1,...)、プログラムは期待どおりに動作します。

于 2016-09-12T15:10:20.633 に答える