【IO】Day4 静态库/动态库,进程

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号进程产生,称为调度进程

你可能感兴趣的:(c++,开发语言)