1.库文件:
1).库文件
库是一组预先编译好的方法的集合;
Linux系统存储库的位置一般在/lib 和 /usr/lib (64位系统/usr/lib64)
库的头文件放在/usr/include
2).库的分类
静态库:libxxx.a(命名规则)
共享库:libxxx.so(命名规则)
3).准备文件:
//add.c
int add(int x,int y)
{
return x+y;
}
//max.c
int max(int x,int y)
{
return x>y?x:y;
}
//main.c
#include <stdio.h>
#include "foo.h"
int main()
{
int a=5,b=10;
printf("a+b=%d\n",add(a,b));
printf("max=%d\n",max(a,b));
return 0;
}
//foo.h
int add(int x,int y);
int max(int x,int y);
2.静态库:
(1).静态库的生成及使用
1)先将需要生成库文件的所有.c文件编译成.o文件;(目标文件)
2)创建静态库(使用ar命令)
ar crv libxxx.a xxxx.o xxx.o
c:创建库
r:将方法添加到库中
v:显示过程
(2)静态库的使用
gcc -o main main.c -L. -lxxx
-L:指定库的存储位置
-l:指定库的名称(不需要前面的lib和扩展名.a)
例如:gcc -o main main.c -L. -lfoo
(3).静态库的缺点:
当你同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本.而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间;
3.共享库:
(1)将所有的.c文件编译成目标文件.o
(2)将所有目标文件打包生成共享库:
gcc -shared -fPIC -o libxxx.so xxx.o xxx.o
(3)共享库的使用:
gcc -o main main.c -L路径 -l库名
共享库执行的时候会出错,找不到对应的共享文件:比如libfoo.so;
注意:共享库必须要放到标准路径下:
sudo mv libxxx.so /usr/lib
补充一个命令:
查看使用了那些共享库:ldd main
4.静态库与共享库的区别:
共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;
而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);
共享库便于升级.
静态库的好处是在目标机器上运行程序的时候,就不再依赖于这个机器的空间,因为已经将方法都包含进来了;而共享库就是只有一份共享,比较节省空间,但是坏处就是运行的时候,这个主机上必须有这个库文件,没有程序就会运行失败;
5.计算机基础知识:
1.计算机组成五大部件:
(1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运算,移位,比较等。
(2) 控制器 : 它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。
(3) 存储器 :存储程序和各种数据。
(4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。
(5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。
2.一台计算机可以抽象成下图:
CPU中包含控制器和运算器,内存就是存储器.I/O设备就是输入设备和输出设备,如:键盘,显示器,鼠标,硬盘,网卡;
3.系统总线
(1)数据总线:用来在各个功能部件中间传输数据,是双向传输总线;
(2)地址总线:用来指出数据总线上的源数据或目的数据在主存单元的地址或IO设备的地址;
(3)控制总线:由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么
在某一时刻由谁来使用,就是控制总线负责完成的.
4.指令相关概念:
(1) 指令 : 是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码和操作码。
(2) 程序 : 由一条一条的指令构成。
(3) 指令周期 : cpu 每取出并执行一条指令所需的全部时间称为指令周期。
(4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。
(5) RISC :精简指令系统计算机。(Reduced Instruction Set Computer)
RISC技术是用20%的简单指令的组合来实现不常用的80%的那些指令功能,但这不意味着RISC技术就是简单地精简其指令集.在提高性能方面,RISC技术还采取了许多有效措施,最有效地方法就是减少执行地执行周期数.
(6) CISC :复杂指令系统计算机。(Complex Instruction Set Computer)
(计算机组成原理332页:关于精简指令系统计算机,复杂指令计算机)
(7) 程序与指令: 高级语言 汇编助记符 机器指令
6.进程的基础知识
1).进程:一个正在运行中的程序;
2).PCB:进程控制块,进程描述符(PID:进程唯一的标识符)
进程控制块是用一个结构体struct task_struct来实现;
<<操作系统精髓与设计原理第六版>>74页;
3).进程的状态:
就绪,阻塞,运行;
时间片轮转调度;
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配
一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程
还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结
束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用
完它的时间片后,它被移到队列的末尾。
4).并发与并行
5).操作系统发展史:
操作系统:管理计算机上的软硬件资源,为用户提供一个交换的接口;
(1)串行处理;
(2)简单批处理;
(3)多道程序设计
(4)分时系统
<<从哲学层次上看操作系统>>第一篇第2章操作系统历史 19页;
<<操作系统精髓与设计原理>>第35页.
7.主函数的三个参数
1).主函数的三个参数的含义:
argc:主函数的参数个数
argv:主函数的参数内容
envp:环境变量;
2).演示代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[],char *envp[])
{
int i=0;
printf("argc=%d\n",argc);// for(;i<argc;i++)
for(;argv[i]!=NULL;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
return 0;
}
gcc -o main main.c
./main
./main hello 123
#观察运行结果思考argc和argv参数的含义;
3).环境变量
for(i=0;envp[i]!=NULL;i++)
{
printf("envp[%d]=%s\n",i,envp[i]);
}
4).总结:
argc:传递给主函数的参数个数
argv:传递给主函数的参数列表,字符指针数组,给主函数传递的参数都是字符串;(以NULL结尾)
envp:继承的环境变量列表,以NULL结尾;