2013-06-10 09:19:03 mybelief321 阅读数 9590

实验目的

   通过编写多进程程序,熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。

实验内容

   该实验有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s后异常退出。父进程先用阻塞方式等待第一个进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第2个子进程结束的消息后,父进程就返回。

实验步骤

   该实验的流程图如下

   

实验源代码

   先看一下下面的代码,这个程序能得到我们所希望的结果吗?它的运行会产生几个进程?

                                                                                                                                                                                 

   执行结果如下图

     

  也有可能会出现下面的结果

  

  分析执行结果可以指知道,这里其实是产生了3个子进程,在子进程2中又产生了一个子进程1。

  下面咱们贴出正确的实验代码:

                                                                                                                                       

  执行结果如下图

   

  不论程序执行多少次,结果都是一样的。对比上一个结果,咱们就可以理解多进程该怎么创建了。一定要明确创建子进程的父进程是哪一个。

  相关实验代码上传到网站,multi_proc_wrong.c点此下载,multi_proc.c点此下载

/************************************************************************************************

*欢迎关注本人公众号:BigBearIT,一起分享交流知识,更多精彩等着你!

*************************************************************************************************/


2015-10-10 10:15:30 zbh19921021 阅读数 5207

Linux_kernel编程基础总结

时间:2015/10/9

背景:学习linux内核编程,总结学习中的经验,方便之后查看;

 

         通常我们想弄清楚linux内核是怎么样工作的,如何使用内核接口来编写linux内核代码的第一步都是搭建一个实验环境来做试验的;这里总结一下实验环境的搭建步骤,和我的一些经验;

步骤一、搭建实验环境

这里资源文件总共有两个:hello.c Makefile

Hello.c 是模块的源码;

Makefile  是编译模块的脚本文件;

//hello.c 源码
#include <linux/kernel.h>
#include <linux/module.h>


static int __init mini2440_hello_module_init(void)
{
  printk (KERN_WARNING "hello , mini2440\n");
  return 0;
}

static int __exit mini2440_bye_module_exit(void)
{
  printk (KERN_WARNING "bye , mini2440\n");
  return 0;
}

module_init(mini2440_hello_module_init);
module_exit(mini2440_bye_module_exit);

MODULE_LICENSE("GPL");

#Makefile文件
obj-m := hello.o

KERNEL_DIR := /lib/modules/$(shell uname -r)/build
#KERNEL_DIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2  

PWD := $(shell pwd)

all:  
  make -C $(KERNEL_DIR) M=$(PWD) modules  

clean:  
  rm *.o *.ko *.mod.c  Module.symvers modules.order

步骤二、编译模块,并执行insmod,rmmod插入卸载模块操作

1、make
2、insmod ./hello.ko
3、dmesg 
4、rmmod hello
5、dmesg -c

分析:从hello.c这个模块源码文件上来看,这个模块的主体是一个很简单的结构,声明了模块在加载的时候执行mini2440_hello_module_init; 模块在卸载的时候执行mini2440_bye_module_exit;分别对应着将不同的字符串打印到串口上;细说一下,在hello.c中前两行的头文件肯定的是指内核的头文件$(kernel)/include/linux而不是在/usr/include的用户空间才使用的头文件路径,而我们所要使用的头文件路径是由Makefile文件中定义好我们要明确使用的是那个内核源码来编译的;

从Makefile进行分析;

Obj-m := hello.o

#表示当前编译想要生成一个动态的模块,这个模块依赖于hello.o来生成;而在makefile中,想要生成hello.o默认的将会执行从hello.c生成;因此Makefile将会自动搜索当前路径下是否有hello.c的文件,如果有则生成hello.o,然后有了hello.o则声称hello.ko;这个是makefile自动匹配的语法;

KERNEL_DIR := /lib/modules/$(shell uname-r)/build

#这句话就是我指定我想编译模块所需要的内核源码路径;可以指定你想指定的任意含有内核源码的路径,编译将会生成对应的内核版本的内核模块;因为linux系统中内核模块有着强烈的版本限制,所以只有对应版本的内核源码编出来的内核模块才能够在对应的内核版本系统中运行;

PWD := $(shell pwd)

#这里使用pwd指令获取当前路径,并将他放在PWD这个变量里面,作为下面make –C makefile的入参;

all: 

 make -C $(KERNEL_DIR) M=$(PWD) modules 

#这里all:就是一个目标,也可以说是一个伪目标,没有实际意义,只是用来表示我要开始执行命令了;

#make –C 表示(change)改变当前makefile的路径,切换到其他makefile中去执行,后面跟的就是想要切换到的路径,这里路径被我定义为/lib/modules/$(shell uname -r)/build

这里ll 这个路径发现,他是一个标准的软连接:指向了

/usr/src/linux-headers-2.6.32-74-generic



之后我们跟踪到/usr/src/linux-headers-2.6.32-74-generic;

Ls -l之后发现这里所有资源指向了上一级的linux-headers.6.32-74


其实我们并不需要关心其他资源,Makefile –C切换过来,需要寻找这个路径下的makefile;我们看看这个文件中的makefile是怎么写的;

在ubuntu 10.04_2.6.32-74内核源码makefile中的69行:这里就强调为什么我们在make –C的时候需要传递一个参数M过去,而不是其他参数;当然这里他是以识别M开头的参数,


如果这里我想挑逗他一下,用一个M1来代替,看看会出什么结果:


将会报错:


Makefile说也可以使用SUBDIRS来代替M;你可以试试:


Make 命令行中最后一个modules表示,这里所要编译的是一个module;

当然你要知道当前所运行的都是在内核源码顶层makefile中运行的,在顶层makefile运行到最后,将会从M中拿到扩展的模块源码进行编译;之后将会生成hello.ko文件;

 

模块名,源码文件名,KO文件名;

         之前一直在困惑,通过Insmod./hello.ko这个文件,最终通过lsmod 查看发现有一个模块名字叫做hello,那么这个模块的命名是由谁决定的;这里面涉及到整个KO编译和插入总共有三个文件名;一个是模块的源码.c文件名;hello.c;另一个是Makefile文件中obj-m:=hello.o编译模块名;最后一个是编译生成的hello.ko文件;之后才清晰的明白其中的转则;

1、  不修改资源文件,默认编译并生成了hello.ko文件;修改hello.ko文件名为hello_back.ko然后插入这个KO文件,之后通过lsmod查看,发现模块名依旧是hello,所以说模块名与KO文件名无关;

2、  模块名取决于obj-m后面跟的是什么,这里obj-m跟的是hello.o所以kernel默认将会生成hello模块;因为Obj-m依赖于hello.o,而makefile语法中想要生成hello.o将要在路径下寻找同名的.c文件(hello.c),也就是这里的第一个名字:源码的.c文件名,就是这么用的;



2017-08-31 17:08:29 LuohuYun 阅读数 331
Linux网络编程介绍
1 什么是Linux网络编程?
网络编程即编写通过计算机网络与其它程序进行通信的这类程序。网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的---客户端和服务器端。网络程序是先有服务器程序启动,等待客户端的程序运行并建立连接.一般的来说是服务端的程序在一个端口上监听,直到有一个客户端的程序发来了请求。网络通信需要网络通信协议支持。Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用, 会返回一个用于通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的好处.我们可以通过向描述符读写操作实现网络之间的数据交流。

2 什么是TCP/IP协议?
TCP/IP 是供已连接因特网的计算机进行通信的通信协议。TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。 这4层分别为:
应用层:应用程序间沟通的层,如超文本传输协议(HTTP)、简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)、域名系统(DNS)等。 
传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。 
网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。 
接口层(主机-网络层):接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。 

3 什么是TCP协议?(Transmission Control Protocol)
TCP是TCP/IP的传输层协议。TCP向应用层提供了一种可靠的面向连接的数据流传输服务。TCP协议是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据。TCP通过三次握手来初始化的。
TCP的三次握手过程:
1 主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我.
2 主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我
3 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了。这样3次握手就完成了,主机A和主机B 就可以传输数据了.
三次握手简版:
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态, 等待服务器确认;SYN:同步序列编号
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成3次握手
3次握手的特点:
没有应用层的数据
SYN这个标志位只有在TCP建产连接时才会被置1
握手完成后SYN标志位被置0
TCP4的4次挥手过程:
1 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求
2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
3 由B 端再提出反方向的关闭请求,将FIN置1
4 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.
由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础。
名词解释
ACK  TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.
SYN  同步序列号,TCP建立连接时将这个位置1
FIN  发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1
TCP的包头结构:
源端口 16位
目标端口 16位
序列号 32位
回应序号 32位
TCP头长度 4位
reserved 6位
控制代码 6位
窗口大小 16位
偏移量 16位
校验和 16位
选项  32位(可选)
这样我们得出了TCP包头的最小长度,为20字节。

4 什么是UDP协议?(User Datagram Protocol)
UDP是一个简单的面向数据报的传输层协议,是一种面向无连接的不可靠传输协议,不需要通过3次握手来建立连接。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
UDP的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位

5 什么是IP协议?
IP协议位于网络层,它提供了不可靠的、无连接的数据报传输机制。TCP/IP是为了适应物理网络的多样性而设计的,而这种适应性主要是通过IP层来体现的。由于物理网络的多样性,各种物理网络的数据帧格式、地址格式之间的差异很大。为了将这些底层的细节屏蔽起来,使得采用不同物理网络的网络之间进行通讯, TCP/IP分别采用了IP数据报和IP地址作为物理数据帧与物理地址的统一描述形式。这样IP向上层提供统一的IP数据报和统一的IP地址,使得各种物理帧及物理地址的差异性对上层协议不复存在。

6 什么是Socket?
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据 报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

Linux网络编程常见面试题
1 TCP 和 UDP编程
TCP传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流TCP套接 口是字节流套接口(stream socket)的一种。
UDP:用户数据报协议,UDP是无连接协议,UDP套接口是数据表套接口(datagram socket)的一种。
TCP UDP区别对比:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
 
优缺点:
TCP: 1)提供认可的方式显示地创建和终止连接
  2)保证可靠的,顺序的,以及不重复的数据传输
  3)允许数据优先
缺: TCP在转移数据的时候,必须创建一个连接,增加开销,比UDP慢
UDP: 1)不要求保持一个连接
  2)没有因接收方认可收到数据包而带来的开销
 3)要求的网络带宽比TCP更小

TCT 和 UDP 编程步骤的不同:
TCP: 
TCP编程的服务器端一般步骤是: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt(); * 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind(); 
  4、开启监听,用函数listen(); 
  5、接收客户端上来的连接,用函数accept(); 
  6、收发数据,用函数send()和recv(),或者read()和write(); 
  7、关闭网络连接; 
  8、关闭监听; 

TCP编程的客户端一般步骤是: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt();* 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 
  4、设置要连接的对方的IP地址和端口等属性; 
  5、连接服务器,用函数connect(); 
  6、收发数据,用函数send()和recv(),或者read()和write(); 
  7、关闭网络连接;

UDP:
与之对应的UDP编程步骤要简单许多,分别如下: 
  UDP编程的服务器端一般步骤是: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt();* 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind(); 
  4、循环接收数据,用函数recvfrom(); 
  5、关闭网络连接; 

UDP编程的客户端一般步骤是: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt();* 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 
  4、设置对方的IP地址和端口等属性; 
  5、发送数据,用函数sendto(); 
  6、关闭网络连接;
 
2 TCP三次握手过程和四次挥手(在上面什么是TCP中介绍) 

3 TCP,UDP,HTTP,SOCKET之间的区别
IP:网络层协议;
TCP和UDP:传输层协议;
HTTP:应用层协议;
SOCKET:TCP/IP网络的API。
TCP/IP代表传输控制协议/网际协议,指的是一系列协议。
TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。
 TCP和UDP是FTP,HTTP和SMTP之类使用的传输层协议。虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。
HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。
记住,需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制,,使用TCP协议来传输数据的HTTP是Web服务器和客户端使用的特殊协议。
Socket 接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,用以开发TCP/IP网络上的应用程序。


4 其他问题:
1.TCP控流原理
利用滑动窗口机制
原理:运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。
该协议允许发送方在停止并等待确认前可以连续发送多个分组。
发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据传输。
2.TCP的拥塞控制
 a.慢启动阶段:发送方一开始便向网络发送多个报文段,直到达到接收方通告的窗口大小为止
 b.拥塞避免阶段:当发现超时或收到3个相同ACK确认帧时,则有丢包
 c.快速重传阶段
 d.快速恢复阶段
3.多线程如何同步    
线程:调度和执行的基本单位
1)线程数据
2)互斥锁
3)条件变量
4)信号量:它被用来控制对公共资源的访问
 
4.进程间的通讯方式:信号,信号量,消息队列,共享内存
进程:一个程序在一个数据集合上的一次运行过程
1)管道:所有的UNIX实现都支持              缺点:只允许单向传输
2)系统IPC:功能强大,能在毫不相关的进程间通信             缺点:关键字使用内核标识
3)Socket:可以跨网络通讯
 
5.三次握手
1.客户端connect连接到server
2.server接受client请求之后,向client端发送一个消息确认
3.client向server发送,确认第2次握手。开始通信
 
6.Tcp四次挥手
1)断开连接的一端发送close请求,         time-wait
2)另一端接收到断开连接的请求之后需要对close进行确认,发送一个消息
3)发送了确认消息之后还要向对端发送close消息,关闭对对端的连接
4)最初发送断开连接的一端接到消息后,对消息确认
 
7.OSI参考模型
物理,数据链路,网络,传输,会话,表示,应用
 
 
网络安全:
1 加密算法:DES       数据加密标准,速度较快,适用于加密大量数据集合
  IDEA     国际加密算法
  AES
Windows编程 句柄:指使用的一个唯一的整数值,即一个4字节长的数值
 
2 strncpy 和 strcpt 的区别:
strcpt(目标串地址,源串的开始地址):从源串的开始到结尾,完全拷贝到目标串地址
strncpy     从源串的开始拷贝n个字符到目标地址,n大于源串长度时,遇到‘\0’结束,n小于源串长度时,到第n个字符结束,但不会在目标串尾补‘\0’
 
Linux2.6内核 同步日志的方法 rsync
 
IP地址中网络号的作用指定了主机的所需网络
系统当前已经加载所有文件系统在/etc/fstab 文件中得到反映
 
找出etc/my.conf 文件属于哪个包(package),可以执行()
rmp -qf /etc/my.conf

应用层:http smtp ftp telnet(网络远程访问协议) dns(域名系统).nfs
传输层:tcp udp
网络层:ip rip icmp
接口层:ethernet , serilal line
 
对进程来说,其虚拟内存的大小不受物理内存大小的限制
定义bash环境的用户文件是        bashrc & bash-profile
 
一个作业需要占用极大连续内存的内存管理是,页式存储管理,段式存储管理
段页式存储管理
 
解决隐马模型中的预测问题的算法是 维特比算法
 
HTTP状态码:
200  服务器成功返回网页
404 请求的网页不存在
503 服务器暂时不可用
301 请求的网页已永久移动到新位置
 
通信管道以自然字符流进行写入和读出
使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录 [-p] 
Linux执行ls,会引起read,execve系统调用
Nginx进程设置为cpu总核心数最佳
Linux中软连接和硬连接,软连接可以跨文件系统进行连接
 
HTTP协议:
http 协议是一个应用层的协议
1)简洁,快速
2)支持客户 服务器模式
3)灵活,http允许传输任意类型的对象,正在传输的类型由Content-Type标记
4)限制每次连接只处理一个请求,可以节省时间
5)无状态协议,对事物的处理没有记忆能力
 
http协议与tcp协议的区别:
http在应用层          tcp在传输层
http是tcp的一个子协议,数据包在网络传输过程中,http被封在tcp包内
https 是ssl加密的
2007-04-08 17:35:00 armman 阅读数 464

所谓编程库就是指始终可以被多个Linux软件项目重复使用的代码集。库是Linux软件开发所追求的目标,C语言就是一个例子,它包含了几百个可以重复使用的例程和调试程序的工具代码,其中包括函数。如果每次编写新程序都要重新写这些函数会感到非常麻烦。

 
使用编程库有两个主要优点,一是可以简化编程,实现代码重复使用;二是可以直接使用许多经过调试的测试和调试工具。

 Linux
下的库文件分为共享库和静态库两大类,它们两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

 Linux
的库一般在/lib/usr/lib目录下。lib是库(Library)的英文缩写,它主要存放系统的链接库文件,没有该目录则系统就无法正常运行。/lib目录中存储着程序运行时使用的共享库。通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小。这个目录包含程序在链接时使用的各种库。

 

区分库类型最好的方法是看它们的文件后缀,通常共享库以.so(Shared Object的缩写)结尾,静态链接库通常以.a结尾(Archive的缩写)。在终端缺省情况下,共享库通常为绿色,而静态库为黑色。

 
2009-12-09 16:49:00 yf24518150 阅读数 203
没有更多推荐了,返回首页