我想知道所有这些输出函数,基本上它们是做什么的?因为我经历过很多次 printf 在遇到它时并不总是在屏幕上打印,而且我听说它会放入缓冲区或类似的东西。因此,如果有人可以清楚地说明实际发生了什么。如果也可以提供有关输入函数的相同信息,那就太好了。你说得越深,就会有很大帮助。. 谢谢。
2 回答
大多数时候 printf 会做这样的事情:(没有缓冲部分和其他小东西)
对于 %s 标志:
void my_putchar(char c)
{
write(1, &c, 1);
}
int my_putstr(char *str) // printf("%s", "hello");
{
int i;
i = 0;
while (str[i] != '\0')
{
my_putchar(str[i]);
i = i + 1;
}
}
对于 %d 标志
void my_put_nbr(int nb) // printf("%d", 100);
{
if (nb > 9)
my_put_nbr(nb / 10);
my_putchar(nb % 10 + '0');
}
打印
将 format 指向的 C 字符串写入标准输出 (stdout)。如果 format 包含格式说明符(以 % 开头的子序列),则 format 后面的附加参数将被格式化并插入到结果字符串中,替换它们各自的说明符。
这里已经很好地解释了printf的实际工作原理:
您的软件调用 printf()。
printf() 处理您的字符串和 args,然后需要执行内核函数,因为在 ring 3 中无法写入文件。
printf() 生成软件中断,将内核函数的编号(在这种情况下为 write() 函数)放入寄存器。
- 软件执行被中断,指令指针移动到内核代码。所以我们现在在环 0 中,在一个核函数中。
内核处理请求,写入文件(stdout 是文件描述符)。
完成后,内核使用 iret 指令返回到软件代码。
软件的代码继续。
ISO C99 第 7.19.3/3 节中的一些有用行
当流未缓冲时,字符应尽快从源或目标出现。否则,字符可能会作为一个块累积并传输到主机环境或从主机环境传输。
当一个流被完全缓冲时,当缓冲区被填满时,字符将作为一个块传输到主机环境或从主机环境传输。
当流被行缓冲时,当遇到换行符时,字符旨在作为块传输到主机环境或从主机环境传输。
此外,当缓冲区被填满时,当在非缓冲流上请求输入时,或者当在需要从主机环境传输字符的行缓冲流上请求输入时,字符将作为块传输到主机环境.
对这些特性的支持是实现定义的,并且可能会受到 setbuf 和 setvbuf 函数的影响。