百科问答小站 logo
百科问答小站 font logo



C语言中,stdio.h是最重要的头文件吗? 第1页

  

user avatar   li-yi-yi-94-2 网友的相关建议: 
      

只是一个普通的标准库文件,它提供了标准输入输出和一些格式化功能,在初学C语言时可能会经常用到printf/scanf来处理输入输出,所以可能会觉得重要。其实libc中的所有函数没什么神奇的,很大一部分其实是单纯的对系统调用的封装,自己也可以实现一个。

其实在很多C语言的应用领域标准输入输出可能是用不到的,比如安卓C/C++开发中会使用_android_log_print函数而非printf进行日志的输出,这个函数向logcat写入数据而非控制台;有些时候也没有标准输入输出用,比如在嵌入式领域,所以一些数据的打印工作会使用串口通信来完成,再比如在Linux内核开发中因为libc还没初始化,所以内核自己提供了printk函数来打印关键日志。

另外关于其他答主说没了stdio无法向控制台输出信息,我贴一个C语言程序

       int main(void) {     const char* out = "hello, no stdio
";     __asm__ (         "mov $1, %%rax
	"         "mov $1, %%rdi
	"         "mov %0, %%rsi
	"         "mov $16, %%rdx
	"         "syscall
	"         ::"r"(out):"%rax", "%rdi", "%rsi", "%rdx"     );     return 0; }     

没有引用任何头文件文件,可以不链接libc,在Linux x86_64下编译并执行

这并不是什么黑魔法,其实只是调用了系统调用罢了,你自己也可以基于这个原理实现一个printf。

在上面的程序中,最关键的是asm中的五行汇编,前四行mov是在为系统调用准备参数,最后一句syscall执行系统调用,第一行的mov $1, %rax指定了系统调用号1在Linux x86_64下对应write,告诉系统我们需要write这个系统调用,第二行mov $1, %rdi,其实就是write系统调用的第一个参数,也就是写入的文件描述符,1代表stdout,下面两行代表了写入的数据和写入数据的长度,最后执行系统调用,Linux就会帮我们把数据打印到控制台了。

-----------更新--------------

有人后台问汇编本来是直接和硬件打交道为什么仍然需要Linux来输出到控制台。这其实是一个相对基础的操作系统问题,虽然汇编语言可以实现在无操作系统的情况下直接向显卡映射空间写入内容来在屏幕上展示内容。但是在操作系统中,运行用户代码时CPU处于较低的特权级(ARM的EL0,x86的ring3),CPU的的权限被限制了,我们并不能任意执行机器指令来和其他硬件直接打交道(比如写入显卡映射的内存空间),要想和硬件打交道必须要经过操作系统处理。

而和操作系统沟通的方法就是系统调用,在古老的x86系统上,常采用int 80h指令发送中断,CPU接收到中断后,会保存当前进程的寄存器信息到栈上,进入操作系统内核准备好的中断处理函数,此时CPU处于较高特权级(ARM的EL1,x86的ring0),操作系统来帮我们完成与硬件有关的操作。

在上面的程序中,syscall指令就是用于系统调用的专用指令(为了加快系统调用速度,现代CPU都设置了专用指令用于系统调用,而不再使用int 80h这样的中断指令),在进入系统调用前,通过寄存器(例子中是rax,rdi,rsi,rdx)将系统调用号和调用参数传递给内核。




  

相关话题

  运算符+左右操作数地位相等吗? 
  第一个 C 语言编译器是用什么语言编写的? 
  C语言中整型输出(%d)有什么用? 
  c语言编辑器哪个好用? 
  C语言的设计模式有哪些? 
  单片机编程最早是汇编,然后从汇编转为c语言,那么,c++会不会替代c语言来进行单片机编程 ? 
  为什么有些编程语言的数组要从零开始算? 
  C语言中for语句的赋初值用int i=1和i=1有什么区别? 
  C语言和C++中,为什么malloc函数需要传入申请的内存大小,而free时候却不需要传大小呢? 
  Linux 内核的 C 代码风格是怎样的? 

前一个讨论
400块以下没有好的蓝牙耳机,一个能打的都没有?
下一个讨论
请问第一题为何不能填being washed而填to wash谢谢您?





© 2024-06-03 - tinynew.org. All Rights Reserved.
© 2024-06-03 - tinynew.org. 保留所有权利