【问题标题】:Difference between printf in Windows and LinuxWindows 和 Linux 中 printf 的区别
【发布时间】:2015-01-20 09:38:29
【问题描述】:

其实除了核心的C语言之外,还有一个C库。如果我的理解是正确的,像 printf 这样的函数是 C 库的一部分。现在我已经在 Windows 中的 Turbo C 中使用 C 编程以及在 Linux 中使用 gcc。

我的问题是:printf 等函数的代码实现在 Windows 和 Linux 中是否相同?最终,printf 函数必须在核心操作系统中调用一个函数(在这两种情况下),它将在屏幕上显示 ASCII 字符?那么由于两个操作系统不同,printf 的代码实现在两种情况下也会不同吗?

【问题讨论】:

  • Turbo C 比第一个 C 标准更老,所以不要指望它表现得像其他符合标准的实现

标签: c linux windows printf


【解决方案1】:

当然(printf<stdio.h> 中的所有函数的实现)是不同的(在 Linux 和 Windows 上),但行为应该符合 C11C99 标准中的规范。

注意printf 不会在屏幕上显示字符,而是将它们发送到标准输出(参见printf(3))。别的东西-e.g.内核tty 层和您在Linux 上的terminal emulator 正在您的屏幕(或其他地方!)上显示字符。

在 Linux 和 POSIX 系统上,<stdio.h> 最终使用system calls 将数据写入file descriptor。它将是write(2)(对于printf),系统调用列表在syscalls(2) 中可用。请注意,stdout 通常是缓冲的(特别是出于性能原因;为每个写入的字节进行 write 系统调用成本太高)。请参阅fflush(3)setvbuf(3)。尝试在您的 Linux 程序上使用 strace(1) 以了解实际使用的系统调用。

在 Windows 上,有一些等效的东西(除了 Windows 上的系统调用列表记录较少并且非常不同)。

顺便说一句,GNU/Linux 主要是free software。所以阅读Advanced Linux Programming 然后研究源代码:libc 通常是glibc(但也可能是musl-libc,等等......所以你可以在几个实现printf Linux,但通常你有一个 libc.so,即使你可以有几个),内核源代码在kernel.org 上可用。

【讨论】:

  • 标准 C 库的某些部分,例如 snprintf(),在 Linux 上的实现比在 Windows 上更忠实于 C (C99) 标准。
  • 在文本文件的情况下,一个区别是在 windows 上 '\n' 被翻译成 '\r' + '\n',而在 Linux 上没有 '\r' 被添加到输出。在监视器上显示文本或输出到文本设备(如老式点阵打印机)时,Linux 必须添加“\r”。
  • 了解标准 C 库的某些部分是基于 UNIX 很重要,因为 C 最初是在 UNIX 系统上设计的。 Windows 上的标准 C 库本质上是一个仿真层。例如,在 Linux 上,一个 C 文件描述符也是一个 Linux 文件描述符,因此如果一个进程有多个模块链接到不同的 C 库,它们可以共享文件描述符。在 Windows 上,C 文件描述符是运行时库本地表中的索引;如果一个进程有多个模块链接到不同的 C 库,文件描述符不能在它们之间共享。
猜你喜欢
  • 2015-10-27
  • 2020-12-01
  • 2020-07-22
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多