C中的Setbuf函数

mrg*_*mrg 0 c unix linux system-calls strace

计划1:

    #include<stdio.h>
    void main()
    {
        printf("Hello\n");
    }
Run Code Online (Sandbox Code Playgroud)

输出:

    $strace ./a.out
    ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
    fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
    .
    .
    .
    .
    write(1, "Hello\n", 6Hello
    )                  = 6
    exit_group(6)                           = ?
    $
Run Code Online (Sandbox Code Playgroud)

计划2:

    #include<stdio.h>
    void main()
    {
        char buf[2];
        setbuf(stdout,buf);
        printf("Hello\n");
    }
Run Code Online (Sandbox Code Playgroud)

输出:

    $ strace ./a.out 
    ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
    fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
    .
    .
    .
    .
    write(1, "Hello\n", 6Hello
    )                  = 6
    exit_group(6)                           = ?
    $
Run Code Online (Sandbox Code Playgroud)

我的要求是找到使用setbuf函数.所以,我试验了上面显示的两个程序.在程序1中,我没有将缓冲区设置为stdout.因此,它使用内置缓冲区.内置缓冲区的大小为4096(大约).为此,Hello足以进行单次写入.因此,写入系统调用只会被调用一次.

但是在程序2中,我明确地设置了大小为2个字符的缓冲区.所以,printf使用这个缓冲区.所以,我的预期输出是应该调用写入系统3到4次.但是,两个程序的strace输出保持不变.

所以在程序2中,printf函数使用缓冲区(buf)不是.如果使用buf,那么写入系统调用将被调用4次.那么,如何检查我的"a.out"程序调用write函数的次数.

rod*_*igo 5

问题是setbuf()没有指定缓冲区的大小,而是假设它BUFSIZ不是2,因为函数永远不会看到它2.

并且因为很可能BUFSIZ2你有缓冲区溢出更大!

这很不方便,这就是为什么有新的setvbuf():

int setvbuf(FILE *stream, char *buf, int mode, size_t size);
Run Code Online (Sandbox Code Playgroud)

将使用如下:

setvbuf(stdout, buf, _IOFBF, sizeof(buf));
Run Code Online (Sandbox Code Playgroud)

PS:你不应该写void main(),int main()而是使用.