从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
会被杀死?)