我正在学习“Unix环境中的高级编程”,并且在第10章中练习 11号时遇到问题。

在我的程序中,我将RLIMIT_FSIZE设置为1024

因此,当尝试超过该限制时,内核应将SIGXFSZ发送到我的程序。

但是我发现,除非将某些内容打印到SIGXFSZ,否则不会发送stdout

这是我的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <signal.h>

#define BUFFSIZE 100

void xfsz_handler(int signo)
{
    fprintf(stderr, "%d, %s\n", signo, strsignal(signo));
}

int main(int argc, char* argv[])
{
    int n;
    char buf[BUFFSIZE];
    struct rlimit fsizeLimit;

    fsizeLimit.rlim_cur=1024;
    fsizeLimit.rlim_max=1024;
    if(setrlimit(RLIMIT_FSIZE, &fsizeLimit) < 0)
    {
        perror("setrlimit error");
        exit(-1);
    }

    if(signal(SIGXFSZ, xfsz_handler)==SIG_ERR)
    {
        fprintf(stderr, "set signal handler error for %d\n", SIGXFSZ);
        exit(-1);
    }

    printf("what ever\n"); /* we need this to get SIGXFSZ sent */


    while ( (n=read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
    {
        int byteWrite = 0;
        if ( (byteWrite = write(STDOUT_FILENO, buf, n)) < 0)
        {
            perror("write error");
            exit(-1);
        }

        if(byteWrite!=n)
        {
            fprintf(stderr, "byteWrite=%d, n=%d\n", byteWrite, n);
            exit(-1);
        }
    }

    if (n<0)
    {
        perror("read error");
        exit(-1);
    }
    return 0;
}

如果我在代码中注释掉以下行,内核将不会传输SIGXFSZ
printf("What ever . . . \n");

为什么会这样?提前致谢。
[root@luaDevelopment ex11]# ./myCopy < /root/workspace/AdvanceProgrammingInTheUnixEnvironment.20140627.tar.bz2 >aa.tar.bz2
byteWrite=24, n=100
[root@luaDevelopment ex11]# make
gcc -o myCopy myCopy.c -std=gnu99 -I../../lib/ -L../../lib/ -lch10
[root@luaDevelopment ex11]# ./myCopy < /root/workspace/AdvanceProgrammingInTheUnixEnvironment.20140627.tar.bz2 >aa.tar.bz2
byteWrite=24, n=100
25, File size limit exceeded
[root@luaDevelopment ex11]#

最佳答案

user3693690在本书的附录C中找到了答案:

关于c - SIGXFSZ由内核发送,除非将某些内容打印到stdout?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24546566/

10-10 05:07