标准库函数在 C 中如何工作? [复制]

2024-03-01

在浏览 C 标准库函数时(glibc), 我找到printf()实际上打电话puts()功能 (_IO_puts)。但我无法找出 put 函数实际上是如何写入的stdout ?

是否使用write()系统调用定义在unistd.h或者是其他东西 ?我发现一件事puts()实际上打电话_IO_xputn通过_IO_putn.

请帮忙。谢谢。


对于包含 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 系统调用之上。这些系统调用包括读、写、打开等。如果您想了解有关系统调用和一些操作系统内部原理的更多信息,请阅读 Andrea Arpaci-Dusseau 的《Three Easy Pieces》一书

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准库函数在 C 中如何工作? [复制] 的相关文章

随机推荐