【问题标题】:Can printf, scnaf,,(I/O functions in stdio.h) be called API?printf, scanf,,(stdio.h中的I/O函数)可以调用API吗?
【发布时间】:2021-02-18 07:46:36
【问题描述】:

我正在学习 Windows、Linux(Ubuntu) 上的操作系统。 根据我的教科书(OS 概念第 10 版),从 OS 的角度来看,API 是与内核交互的一组函数(如系统调用)......所以我的问题是这个......

  1. stdio.h可以调用API吗??
  2. stdio.h 之类的库可以跨平台使用 平台(Ubuntu,Windows ..)。有没有通用的API,比如 stdio.h,可以跨平台使用??

【问题讨论】:

    标签: operating-system


    【解决方案1】:

    您需要知道 C 语言只是一种约定。当像您这样的开发人员或任何人实现编译器时,他们会为特定的操作系统编写该编译器。这意味着 stdio.h 基本上是一组专门为操作系统编译的函数,它只能在该操作系统上工作,除非另一个操作系统以相同的方式(使用相同的系统调用)实现相同的函数。基本上,需要系统调用的所有内容都特定于一个操作系统,其他所有内容都将是跨平台的,因为它仅依赖于底层处理器。

    操作系统本身可以描述为用 C/C++ 编写的程序,但依赖于操作系统将在其上运行的处理器。在编写操作系统时,您不能使用通常需要系统调用的任何函数,因为实现系统调用取决于您。这意味着您只剩下指针、函数、结构等基本语言。

    我不会将 stdio.h 称为 API,因为 API 更像是您可以从 C/C++ 等语言调用的函数,这些语言将直接在内核中调用。例如,在 Windows 上,您可以使用 CreateWindowExW() 函数从 C++ 中创建一个窗口。此函数更好地响应 API 的定义,而 printf() 并不是真正的 API,而更像是编译为 API 调用的高级函数。

    最后,您使用的编译器会将 .cpp 或 .c 之类的文本文件编译为某种常规格式的可执行文件。当您引导计算机(如果您正在编写操作系统)时,由您来解释这种传统格式。例如,Linux 内核被编译为 .elf 文件,这是一种传统的文件格式。然后像 GRUB 这样的引导代码将解释该文件格式,以便能够跳转到内核的入口点。 Linux 内核是一个静态链接的 C 程序,它只使用基本的 C 语言,如指针等。

    希望这能回答你的问题。

    【讨论】:

    • 好吧,,,,你的意思是 printf 函数本身就像 shell(就像调用主力函数的驱动函数)覆盖了真正的系统调用函数(并且这个函数很可能在你的定义)。对吗??????。
    • 是的,基本上,printf 是作为高级函数实现的,它调用执行实际打印的 Linux/Windows API 函数。
    • 还有一个,可以吗?
    • 当然。来吧。
    • 嗯对不起,我稍后再问,我需要先看看我的学习文件。
    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2019-03-24
    • 2012-01-20
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多