首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Seccomp:为什么下面的程序会死锁?

Seccomp:为什么下面的程序会死锁?
EN

Stack Overflow用户
提问于 2016-08-05 17:52:03
回答 2查看 187关注 0票数 1

我有一个简单的测试程序:

代码语言:javascript
复制
#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不会杀死整个过程吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-12 23:10:21

原因是printf函数。

如果在程序上运行strace -f (没有prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);行),您将看到创建的线程调用futex系统调用。

seccomp模式禁止对futex的调用,因此线程被终止,因此pthread_join无限期地等待。

如果你用write(1,...)替换printf(),程序将会表现出预期的效果。

票数 1
EN

Stack Overflow用户

发布于 2016-10-19 22:00:55

创建的线程与原始线程具有不同的进程ID (根据strace)。因此,当新线程违反seccomp时,只有它会被杀死。这意味着死锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38786318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档