计划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中,我没有 将缓冲区设置为stdout。因此,它使用内置缓冲区。内置缓冲区的大小为4096(大约)。为此,你好就足够了 单写。因此,写入系统调用只会被调用一次。
但是在程序2中,我明确地设置了大小为2个字符的缓冲区。所以,printf使用这个缓冲区。所以,我的预期输出是 应该调用写入系统3至4次。但是,两个程序的strace输出保持不变。
所以在程序2中,printf函数使用缓冲区(buf)不是。如果使用buf,那么写入系统调用将被调用4次。 所以,我如何查看我的&#34; a.out&#34;程序调用写入功能。
答案 0 :(得分:5)
问题是setbuf()
没有指定缓冲区的大小,它被假定为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()
。