ulimit对核心文件大小不起作用?

时间:2015-11-21 15:29:07

标签: c++ linux bash

试图限制核心转储文件的大小。我想限制为大约4MB,所以我将其设置为1000(块,每个块为4KB)。但它并不限制核心转储文件的大小。有任何想法吗?

$ ulimit -c
1000
$ rm core; ./a.out
start...
Floating point exception (core dumped)
$ ls -l core
-rw------- 1 jin1 jin1 100405248 Nov 21 09:22 core

a.out是由一个简单的C ++源代码生成的。不要认为这很重要。

#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <exception>
#include <stdexcept>

void baz() {
 int a = 0;
  printf("%d\n", 1/a);       // causes segfault
}

void bar() { baz(); }
void foo() { bar(); }

char buf[100000000];
int main(int argc, char **argv) {
    for (int i=0; i<100000000; i++) 
        buf[i] = 'a';
    printf("start...\n");
    foo();
    printf("%c\n", buf[100]);
}

更新2

使用setrlimit和getrlimit更新代码段,现在我没有获得核心文件。想知道为什么。这是快速运行:

$ g++ te2.cc
$ ./a.out
start with limit: 1000 1000
Floating point exception (core dumped)
$ ls -l core
ls: cannot access core: No such file or directory
$ ulimit -c
1000

这是te2.cc的新来源

#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <exception>
#include <stdexcept>
#include <sys/resource.h>

void baz() {
 int a = 0;
  printf("%d\n", 1/a);       // causes segfault
}

void bar() { baz(); }
void foo() { bar(); }

char buf[50000000];
int main(int argc, char **argv) {
    for (int i=0; i<50000000; i++) 
        buf[i] = 'a';
    struct rlimit n= {1000, 1000};
    struct rlimit v = {0,0};
    setrlimit(RLIMIT_CORE, &n);
    getrlimit(RLIMIT_CORE, &v);
    printf("start with limit: %ld %ld\n", v.rlim_cur, v.rlim_max);
    foo();
    printf("%c\n", buf[100]);
}

1 个答案:

答案 0 :(得分:0)

在Linux Mint 17.2 64bit上我使用了ulimit -c 1000并运行了ulimit -a来确认设置了值并运行了你的样本。我的核心是:
 1024000 11月21日10:43核心

在运行代码之前运行ulimit -a以确保您的设置存在。

对于软或硬设置,还可以选择运行ulimit -Sc 1000或ulimit -Hc 1000。我希望这会有所帮助。