Linux系统编程手册笔记(一)

本文详细介绍了Linux系统编程中的关键概念,包括过滤器命令、进程的内存布局、进程创建与执行、进程ID与父进程ID、init进程、内存映射以及静态库和共享库的使用。通过学习,读者可以掌握Linux系统中程序执行的本质和资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考 https://blog.youkuaiyun.com/eliot_shao/article/details/78648314
1.程序

  • 过滤器:cat ,grep,tr,sort,wc,sed,awk (从stdin 读取输入,加以转换并将转换后的数据输出到stdout)
  • 命令行参数 :程序运行时在命令行中输入的参数
 int main(int argc,char argv[] )
 argc表示命令行输入的参数个数,argv指针数组的成员指针逐一指向每个命令行参数字符串,argv[0]表示程序本身

2.进程
正在执行的程序为进程,执行时,内核会将程序代码载入虚拟内存,并为程序变量分配 空间并记录与进程相关的各种信息
程序终止时,内核会释放所有资源

2.1进程的内存布局

  • 文本:程序的指令
  • 数据:程序使用的静态变量
  • 堆:程序可以从该区域动态分配额外内存
  • 栈:最函数调用返回而增减的一片内存,用于为局部变量和函数调用链接信息分配的存储空间

2.2创建进程和执行程序
进程可使用系统调用fork()创建子进程,子进程继承来自父进程的数据段、堆段、栈段的副本,可以修改切不影响父进程内容(标记只读的部分由父进程、子进程共享)
子进程或者去执行共享代码段中的另一组不同的函数,或者使用系统调用execve()去加载执行一个全新的程序。execve()会销毁当前数据段、堆段、栈段几文本段,并根据新程序代码,创建新段来进行替换
2.3 进程ID和父进程ID
每一个进程有唯一一个整数型进程标示符PID,及一个父进程标识符PPID
2.4 init进程
系统引导时,内核会创建一个名为init的特殊进程,“所有程序之父”,系统的所有进程要么由init亲自创建,要么由后代进程创建。init进程号为1,并且总是以超级用户权限运行
2.5 内存映射
调用系统函数mmap()的进程,会在虚拟地址空间中再创建一个新的内存映射,
某一进程映射的内存可以与其他进程的映射共享。有两种共享方式,一、两个进程都针对某一文件的相同部分加以映射,二是由fork()创建的子进程从父进程处继承映射。
2.6静态库和共享库
静态库是对已经编译的目标模块的一种结构化整合,在主程序中使用静态库中的目标函数时进行静态链接:链接器解析到主程序对静态库的引用,从静态库中抽取出所需要目标的副本,并复制到最终的可执行文件中。即通过代码拷贝的方式完成。
静态库中存在的问题:多个不同的程序调用同一段代码,会存在多个副本,浪费磁盘空间;调用同一个库函数的程序,均以静态链接的方式生成且被加载到内存中,会造成内存浪费;如果对库函数进行修改,存在多个程序需要与新生成的库重新链接的情况

静态链接库:

1、编译生成目标文件

gcc -c struct.c

2、创建静态库

ar cqs libstruct.a struct.o (顺序不能乱)

3、链接静态链接库,生成可执行文件

gcc main.c -static -L. -lstruct -o main
共享库:如果将程序链接到共享库,链接器就不会把目标模块拷贝到可执行文件中,而是在其中生成一条记录。一旦在运行时可执行文件载入内存,动态链接器确保找到动态库,随后实施运行时链接,解析主程序函数调用,并与共享库中函数定义关联。在运行时,内存中只需要保留一份,可供所有运行时的程序使用。
  优点:节约内存,更新时是需要一次编译,随后其他程序编译时会自动链接新库
动态链接库:

1、编译成动态链接库

gcc struct.c -fPIC -shared -o libstruct.so

2、链接动态链接库,生成可执行文件

gcc main.c -L. -lstruct -o main

3、设置库文件的环境路径

1)在bashrc或profile文件里用LD_LIBRARY_PATH定义,然后用source加载。

2)把库路径添加到ld.so.conf文件中,然后用ldconfig加载。

3)ldconfig /home/user/lib,仅能暂时性使用,若下次ldconfig时此目录下的动态链接库就不能被共享

了。

gcc一些参数解析

-shared:指定生成动态链接库。

-static:指定生成静态链接库。

-fPIC:表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码,概念上就

是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。

-L.:表示要连接的库在当前目录中。

-l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加

上lib,后面加上.so来确定库的名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值