背景
同事用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; }
原文:http://my.oschina.net/guonaihong/blog/511342