SIGXFSZ信号

背景

同事用go写了一个简单转发业务流量的工具。跑了9个小时coredump。直接被冲击了三观,最后分析了看,是测试机器设置不当导致的,下面聊下罪魁祸首SIGXFSZ信号。

什么情况下系统会发送SIGXFSZ信号

在linux/unix系统里定义了一些异步的机制。这个就是信号。

其中有个信号名为SIGXFSZ。当某个进程写文件,单个文件大小超出限制,这时操作系统会向它发送SIGXFSZ。

SIGXFSZ信号的默认动作是:终止进程+生成coredump文件。

如何设置限制

1.在shell层次限制

 ulimit -f value #其中 value * blocks(默认1024字节) = 最大限制的字节数

2.在c语言层次限制

 struct rlimit new_rlim;
 int rv;
 new_rlim.rlim_cur = new_rlim.rlim_max = 10; //跟shell不同,c里面的大小代表其实字节数
 rv = setrlimit(RLIMIT_FSIZE, &new_rlim);
 if (rv != 0) {
     printf("%d:(%s)\n", rv, strerror(errno));
     return -1;
 }

如何消除限制

1.在shell层次去掉限制

ulimit -f unlimited

2.在c语言层次去掉限制

 struct rlimit new_rlim;
 int rv;
 new_rlim.rlim_cur = new_rlim.rlim_max = -1; //跟shell不同,c里面的大小代表其实字节数
 rv = setrlimit(RLIMIT_FSIZE, &new_rlim);
 if (rv != 0) {
     printf("%d:(%s)\n", rv, strerror(errno));
     return -1;
 }
时间: 2024-10-12 12:27:17

SIGXFSZ信号的相关文章

第5章 进程环境(4)_进程资源限制

5. 进程资源限制 (1)getrlimit.setrlimit函数 头文件 #include<sys/resource.h> 函数 int* getrlimit(int resource, struct rlimit* rlptr); 返回值 成功返回0,出错返回非0 功能 获得资源限制,存放在rlptr指向的结构体中 参数 (1)rlimit结构体 struct rlimit{ rlim_t rlim_cur; //软限制:当前限制 rlim_t rlim_max; //硬限制:rlim_

[APUE]UNIX进程的环境(下)

一.共享库 共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本.程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函数相链接,这减少了每个可执行文件的长度,但增加了一些运行时间开销.另一个优点就是可以用库函数的新版本来替换老版本而无需对该库的程序重新链接编译. 不同的系统使用不同的方法说明程序是否需要使用共享库.比较典型的有cc和ld命令的可选项. 二. 存储器分配 ANSI C说明了三个存储空间动态分配的函数(

Linux系统调用--getrlimit()与setrlimit()函数详解

http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html 功能描述:获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值.非授权调 用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制.授权进程可以任意改变其软硬限制.RLIM_INFINITY的 值表示不对资源限制. 用法: #include <sys/resource.h>int getr

本渣的OJ开发的笔记(1)

最近想挖坑搞个跑在linux上的OJ,查了很多资料,也读了很多大神的代码,自己有些感悟.于是把评测内核的部分功能写了出来,这里做个笔记备忘啦. 学校用的OJ是几年前的hustoj,只支持C/C++,Java和Pascal跑起来老是出现莫名奇妙的错误,感觉某学长没有搭好(╬ ̄皿 ̄).自己想搞的OJ以后应该能支持C/C++/Java/Pascal/C#/Scala/Python这些语言吧(期待ing),之前在网上看见一些比较牛的在线编译器,如 http://codepad.org/ 和 http:/

Linux编程---进程基础

进程这个概念大家都很熟悉了吧...我就不多说了.. 首先是进程环境.也就是Shell相关的内容. 这都是很基础的我就挑一些我自己都不太清楚的写写. 一.命令行参数 POSIX对命令行的语法约定: 1.实用程序名至少两个,至多9个字符,且只包含小写字母和数字.(Linux应该不止9个吧.我觉得这是Unix下shell的规定). 2.选项名必须是但个字母或者数字,-W选项保留给实现扩展使用,不允许多数字选项. 3.选项和它的选项值可以作为也可以不作为分开的单词.即-ofoo和-o foo是一样的..

c c++ signal编程

1. 头文件#include <signal.h> 2. 功能设置某一信号的对应动作 3. 函数原型void (*signal(int signum,void(* handler)(int)))(int);    分解来看:   typedef void (*sig_t) (int);   sig_t signal(int sig, sig_t func);   第一个参数是目标信号.func参数是一个指针,指向某个处理该信号的函数.这个处理信号函数带有一个int型参数,并应返回void. 

Linux的getrlimit与setrlimit系统调用

转自:http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html 功能描述:获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值.非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制.授权进程可以任意改变其软硬限制.RLIM_INFINITY的值表示不对资源限制. 用法: #include <sys/resource.h> int ge

32位Linux文件限制大小

线上程序不断重新启动,查看log发现是进程由于SIGXFSZ信号退出.对过大的文件进行操作的时候会产生此信号,一般仅仅在32位机器上出现,文件限制大小为2G.用lsof查看进程打开的文件,果然有一个文件达到2G. 解决方式:编译时加上參数:-D_FILE_OFFSET_BITS=64:代码中调用lseek时參数为off_t(不要为int或long,否则在32位和64位中表现不同). 附上一个链接,linux大文件支持:http://users.suse.com/~aj/linux_lfs.htm

C++异常处理机制几种方法

一.异常 迄今为止,我们处理程序中的错误一般都是用if语句测试某个表达式,然后处理错误的特定义代码. C++异常机制使用了三个新的关键字  (SEH(结构化异常处理)) try    ──标识可能出现的异常代码段 throw  ──抛出一个异常 catch  ──标识处理异常的代码段 提示: 使用异常处理将带来更多的系统开销.因此慎用异常. 二.抛出异常 throw throw必须在 try代码块中.后边跟的值决定抛出异常的类型. 三.捕获异常 catch 出现在try代码块后,后边跟的数据决定