UNIX下的C语言编程。
什么是操作系统?
计算机的操作系统就是一套用于管理硬件资源和软件资源的软件。
计算机的硬件资源通过驱动向操作系统的内核提供接口,让操作系统可以调用硬件资源。
这些接口称为driver
操作系统的内核向上层应用提供接口,让上层应用可以通过这些接口间接的调用硬件资源。
这些接口称为system call
在system call层面,会有库文件封装部分的接口,当有其他的程序向库文件发起请求的时候,库文件会代替这些程序去调度system call的接口。
一些厂家在system call 的基础上,发展了自己的应用程序,例如 shell,vi,gcc。
当内核和应用程序结合的时候,才称为操作系统。
shell是一个需要精修的内容,它不仅是一套程序,还是一种脚本编程语言,学好shell,我就可以欢乐的继续我的lua了。
前面提到了库文件,标准c语言,就是从标准c语言库的基础上展开的。
c++则打包了c语言的库,还加上了stdc++。
c/c++实现了一个虚拟机,虚拟机可以看作一个虚拟的操作系统,这样java就可以跑在jvm上面了。
而UC,它和标准C语言不同的地方在于,它是直接对system call 层面的接口操作,自己完成调度,不借助库。
linux和unix是两种不同的内核,但是它们遵循同样的system call 和 drive层面的接口标准。
GNU是基于两种内核提供的接口开发上层应用的。
centos,rehat等,称为套件,它们的内核都是linux,加上了GNU的上层应用,然后稍微加点自己公司开发的软件,就称为不同的套件了。
unix->xneix->windows
unix->macos
unix->ios
linux + jvm + android
一个.c文件编译的全过程发生了什么?
1、从.c文件,先进行预处理 (gcc -E .c -o .i)
预处理的时候,预处理器会识别.c源文件中的#符号,和注释。
带有#符号的指令都是下达给预处理器的,包括:
#include
#define
#ifdef
当预处理遇到include的时候,它会寻找include的参数(一个文件),如果找到了就把它copy过来,复制在include指令的位置。要注意,如果我的这个文件不存在,在预编译阶段就会报错。
当预处理器遇到注释的时候,就会剔除它们。
当预处理器遇到条件编译的时候,不符合条件的部分,预处理器也会剔除它们,而不是跳过。
最后生成一个.i文件
2、对.i文件进行编译(gcc -S .i -o .s)
编译器会对.i文件编译成.s的汇编语言
3、把.s的汇编语言汇编成.o的目标文件(gcc -c .s -o .o)
只有把汇编语言翻译成机器语言的这一个过程才能称为,汇编。