SIGXFSZ信号

背景

    同事用go写了一个简单转发业务流量的工具。跑了9个小时coredump。直接被冲击了三观(go也会coredump?),最后分析了看,是测试机器设置不当导致的,测试人员把日志文件重定向到终端,日志文件大小超过终端限制(这值可人为设置,默认没有大小限制),最后操作系统向服务端发送了SIGXFSZ信号,下面聊下罪魁祸首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;
 }


你可能感兴趣的:(SIGXFSZ信号)