c - C 中的 setbuf 函数

标签 c linux unix system-calls strace

程序 1:

    #include<stdio.h>
    void main()
    {
        printf("Hello\n");
    }

输出:

    $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)                           = ?
    $

程序 2:

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

输出:

    $ 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)                           = ?
    $

我的需求是找到setbuf函数的使用。所以,我试验了上面显示的两个程序。在程序 1 中,我没有 将缓冲区设置为标准输出。因此,它使用内置缓冲区。内置缓冲区的大小为 4096(大约)。为此,你好就足够了 单写。所以,写系统调用只会被调用一次。

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

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

最佳答案

问题是setbuf()没有指定buffer的大小,假设是BUFSIZ,不是2,因为该函数永远不会看到 2

并且由于很可能 BUFSIZ 大于 2,所以您有缓冲区溢出!

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

int setvbuf(FILE *stream, char *buf, int mode, size_t size);

这将用于:

setvbuf(stdout, buf, _IOFBF, sizeof(buf));

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

关于c - C 中的 setbuf 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32720567/

相关文章:

linux - 系统调用 : UNIX, Linux、BSD 和 Solaris 变体

c - C 中的多线程错误段错误

c - 将结构数组初始化为共享内存

linux - Kubernetes:无法安装仪表板

docker - 无法在UNIX环境中执行Docker命令

python - 在 python 中编辑 plist

我可以使用 envp setenv() 吗?

c - 在 CodeVisionAVR 中使用定时器生成正弦波形

c - 使用 MSVC 从命令行构建 DLL(无入口点)

使用 select 函数关闭服务器