【发布时间】:2015-09-22 15:12:01
【问题描述】:
方案一:
#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) = ?
$
方案二:
#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(大约)。为此,你好就足够了 单写。因此,write 系统调用只会被调用一次。
但是在程序 2 中,我明确设置了 2 个字符大小的缓冲区。所以, printf 使用这个缓冲区。所以,我的预期输出是 写系统应该被调用 3 到 4 次。但是,两个程序的 strace 输出保持不变。
所以在程序 2 中,printf 函数使用的 buffer(buf) 不是。如果是使用buf,那么write系统调用会被调用4次。 那么,如何检查我的“a.out”程序调用了 write 函数的次数。
【问题讨论】:
-
同样,void main(){} 应该是 int main(void){}
标签: c linux unix system-calls strace