Linux setrlimit()不会杀死进程

时间:2018-02-21 17:42:35

标签: c linux signals posix

setrlimit的手册页设置RLIMIT_CPU限制后,一旦达到软限制,流程应该每秒收到SIGXCPU,当硬限制时,应该SIGKILL到了。

我有以下代码,其中使用clone()调用创建子进程。然后设置RLIMIT_CPU,然后设置长循环,应该通过SIGKILL终止。这似乎适用于SIGCHLD标志集。但是,当我使用SIGCHLD | CLONE_NEWPID标志时,循环不会终止。

修改

我的机器上发生了什么:程序写入pid 1 interrupted两次,然后执行冻结(循环正在运行并且没有被杀死),直到循环结束。这持续约10秒钟。当我删除CLONE_NEWPID程序3秒后终止。

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sched.h>

int inside(void *arg)
{
    struct rlimit r = {1, 3};
    setrlimit(RLIMIT_CPU, &r);
    for (long long i = 0; i < 3e9; i++);
    return 0;
}

void handler(int signal)
{
    printf("pid %d interrupted\n", getpid());
    fflush(stdout);
}

void setup_signals(void)
{
    struct sigaction s;
    bzero(&s, sizeof s);
    s.sa_handler = handler;
    sigaction(SIGXCPU, &s, NULL);
}

int main(void)
{
    const int stack_size = 1 << 16;
    char stack[stack_size];
    setup_signals();
    int pid = clone(inside, stack + stack_size, SIGCHLD | CLONE_NEWPID, NULL);
    if (pid < 0) return 1;
    wait(NULL);
    return 0;
}

为什么子进程没有被杀死(如果你删除CLONE_NEWPID会被杀死?)

0 个答案:

没有答案