z1> 完成动态库和静态库的制作以及使用
静态库制作和使用
1.1 创建头文件、库文件、源文件如下,并准备对应的.h和.c文件:
ubuntu@ubuntu:static_lib$ tree
.
├── inc
│ └── add.h
├── lib
└── src
├── add.c
└── main.c
头文件:add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif
源程序:add.c
int add(int a,int b)
{
return a+b;
}
主函数: main.c
#include
#include
int main(int argc, const char *argv[])
{
printf("%d\n",add(100,200));
return 0;
}
1.2 将源程序编译生成静态库
gcc -c add.c -o add.o //只编译不链接,生成一个源程序的二进制文件add.o
ar -crs libadd.a add.o //依赖于add.o生成一个add.a的静态库
ubuntu@ubuntu:src$ gcc -c add.c -o add.o
ubuntu@ubuntu:src$ ar -crs ../lib/libadd.a add.o
.ubuntu@ubuntu:static_lib$ tree
├── inc
│ └── add.h
├── lib
│ └── libadd.a
└── src
├── add.c
├── add.o
└── main.c
1.3 使用静态库
gcc main.c -L 库的路径 -l库名 -I 头文件路径
./a.out
ubuntu@ubuntu:src$ gcc main.c -L ../lib/ -ladd -I ../inc/
ubuntu@ubuntu:src$ ./a.out
300
动态库的创建和使用
2.1 创建头文件、库文件、源文件如下,并准备对应的.h和.c文件:
ubuntu@ubuntu:dynamic_lib$ tree
.
├── inc
│ └── add.h
├── lib
└── src
├── add.c
└── main.c
头文件:add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif
源程序:add.c
int add(int a,int b)
{
return a+b;
}
主函数: main.c
#include
#include
int main(int argc, const char *argv[])
{
printf("%d\n",add(100,200));
return 0;
}
2.2 生成动态库:
命令:gcc -fPIC -shared add.c -o libadd.so
ubuntu@ubuntu:src$ gcc -fPIC -shared add.c -o ../lib/libadd.so
2.3 使用动态库
编译可执行文件: gcc main.c -L ../lib/ -ladd -I ../inc/
ubuntu@ubuntu:src$ gcc main.c -L ../lib/ -ladd -I ../inc/
指定库的路径:
方式1:将自己的库放在/lib
ubuntu@ubuntu:lib$ sudo mv libadd.so /lib
ubuntu@ubuntu:lib$ cd ../src/
ubuntu@ubuntu:src$ ./a.out
300
方式2:通过命令指定库的路径 (只在当前终端生效)
ubuntu@ubuntu:src$ export LD_LIBRARY_PATH=../lib/
ubuntu@ubuntu:src$ ./a.out
300
方式3:通过修改库的配置文件让其生效
ubuntu@ubuntu:src$ sudo vi /etc/ld.so.conf.d/libc.conf
ubuntu@ubuntu:src$ sudo ldconfig
ubuntu@ubuntu:src$ ./a.out
300
ubuntu@ubuntu:dynamic_lib$ tree
.
├── inc
│ └── add.h
├── lib
│ └── libadd.so
└── src
├── add.c
├── a.out
└── main.c
2> 关于进程的相关指令复习一遍
1> 查看进程的命令:ps
ps -ef:用于显示进程间的关系
ps -ajx:可以显示进程的状态(常用)
ps -aux:可以显示进程所在计算机资源的百分比
pidof 可执行程序名:查看某个进程的pid (如pidof a.out)
kill -l :查看所有信号
top:动态查看运行的进行状态
htop:带颜色动态查看进程运行状态
pstree:显示进程的关系树
killall 进程名:杀死所用名为进程名的进程
ctrl+z(kill -19 pid),暂停一个进程
kill -18 pid:重启进程,(后台运行)
jobs -l:查看一个进程的作业号
bg 作业号 (后台运行)
fg 作业号(前台运行)
2.1创建进程fork()
#include
int main(int argc, const char *argv[])
{
sleep(10); //休眠10s
fork(); //产生一个子进程
while(1);
return 0;
}
运行后,产生一个子进程:6790
ubuntu@ubuntu:day4$ ps -ajx | grep a.out
2454 6787 6787 2454 pts/1 6787 R+ 1000 0:09 ./a.out
6787 6790 6787 2454 pts/1 6787 R+ 1000 0:09 ./a.out
5070 6794 6793 5070 pts/2 6793 S+ 1000 0:00 grep --color=auto a.out
2.2多次使用fork(): 产生2^n个进程
#include
int main(int argc, const char *argv[])
{
sleep(10); //休眠10s
// 6705
fork(); // 6705 6710
fork(); // 6705 6711 6710 6712
fork(); //6705 6713 6711 6716 6710 6714 6712 6715
while(1);
return 0;
}
运行后,产生8个进程 :6716 6715 6714 6713 6712 6711 6710 6705
ubuntu@ubuntu:day4$ ps -ajx | grep a.out
2454 6705 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
6705 6710 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
6705 6711 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
6710 6712 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
6705 6713 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
6710 6714 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
6712 6715 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
6711 6716 6705 2454 pts/1 6705 R+ 1000 0:08 ./a.out
5070 6718 6717 5070 pts/2 6717 S+ 1000 0:00 grep --color=auto a.out
3. 进程的概念、组成、种类,特殊进程
3.1 进程就是正在执行的任务,进程是计算机分配资源的最小单位,每个进程计算机都会为其分配4G的虚拟内存,每个进程都独立拥有自己的0--3G的用户空间,并且所有进程会共享3--4G的内核空间
3.2 系统在调度进程时的调度原则:时间片轮询,上下文切换
3.3 特殊的进程:当系统启动后,会默认启动三个进程,进程号分别是:0、1、2
0号进程(idel):是linux系统在启动时默认启动的第一个进程,叫空闲进程,当没有其他进行执行时,才会执行该进程
1号进程(init):该进程是由0进程产生,用于完成进程的初始化工作,孤儿进程会被1号进程收养
2号进程(kthreadd):该进程也是由0号进程产生,称为调度进程