标准库函数如何在 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”