标准库函数如何在 C 中工作?
How puts standard library function works in C?
在查看 C 的标准库函数 (glibc
) 时,我发现 printf()
实际上调用了 puts()
函数 (_IO_puts
)。但是我无法找出 puts 函数实际上是如何写入 stdout
?
它是否使用 unistd.h
中定义的 write()
系统调用或其他?我发现一件事 puts()
实际上是通过 _IO_putn
.
调用 _IO_xputn
请帮忙。谢谢。
对于包含 Linux 的基于 Unix 的系统,stdio 库中的大多数函数都是比标准 I/O 系统调用高一层的包装器。你看,操作系统提供了一组称为系统调用的 API。应用程序无法直接访问硬件资源,因此它们通常在需要执行任何类型的特权操作(如写入屏幕或从键盘读取)时调用这些“系统调用”。
在 Unix 中,一切都被抽象为一个文件,因此无论何时您需要将字符写入屏幕,您需要做的就是打开一些代表“屏幕”的文件并将这些字符写入其中。内核会处理剩下的事情。很简单,这就是您在 C:
中执行此操作的方式
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFF_SIZE 2
int main()
{
int terminal;
char buffer[BUFF_SIZE] = "C\n"; // This will store the character to print + new line
terminal = open("/dev/tty", O_WRONLY); // systemcall to open terminal
if (terminal < 0)
exit(1); // some error happened
dup2(terminal, STDOUT_FILENO); // use our newly opened terminal as default Standard output
if (write(terminal, buffer, BUFF_SIZE) != BUFF_SIZE) // systemcall to write to terminal
exit(1); // We couldn't write anything
}
这只是向您展示 stdio 中的所有内容都位于基本 I/O 系统调用之上。这些系统调用是读取、写入、打开等。如果您想了解有关系统调用和一些 OS 内部的更多信息,请阅读 Andrea Arpaci-Dusseau
的书“Three Easy Pieces”
在查看 C 的标准库函数 (glibc
) 时,我发现 printf()
实际上调用了 puts()
函数 (_IO_puts
)。但是我无法找出 puts 函数实际上是如何写入 stdout
?
它是否使用 unistd.h
中定义的 write()
系统调用或其他?我发现一件事 puts()
实际上是通过 _IO_putn
.
_IO_xputn
请帮忙。谢谢。
对于包含 Linux 的基于 Unix 的系统,stdio 库中的大多数函数都是比标准 I/O 系统调用高一层的包装器。你看,操作系统提供了一组称为系统调用的 API。应用程序无法直接访问硬件资源,因此它们通常在需要执行任何类型的特权操作(如写入屏幕或从键盘读取)时调用这些“系统调用”。
在 Unix 中,一切都被抽象为一个文件,因此无论何时您需要将字符写入屏幕,您需要做的就是打开一些代表“屏幕”的文件并将这些字符写入其中。内核会处理剩下的事情。很简单,这就是您在 C:
中执行此操作的方式#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFF_SIZE 2
int main()
{
int terminal;
char buffer[BUFF_SIZE] = "C\n"; // This will store the character to print + new line
terminal = open("/dev/tty", O_WRONLY); // systemcall to open terminal
if (terminal < 0)
exit(1); // some error happened
dup2(terminal, STDOUT_FILENO); // use our newly opened terminal as default Standard output
if (write(terminal, buffer, BUFF_SIZE) != BUFF_SIZE) // systemcall to write to terminal
exit(1); // We couldn't write anything
}
这只是向您展示 stdio 中的所有内容都位于基本 I/O 系统调用之上。这些系统调用是读取、写入、打开等。如果您想了解有关系统调用和一些 OS 内部的更多信息,请阅读 Andrea Arpaci-Dusseau
的书“Three Easy Pieces”