博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux系统编程手册笔记(一)
阅读量:4126 次
发布时间:2019-05-25

本文共 1847 字,大约阅读时间需要 6 分钟。

参考

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.c2、创建静态库ar cqs libstruct.a struct.o (顺序不能乱)3、链接静态链接库,生成可执行文件gcc main.c -static -L. -lstruct -o main
共享库:如果将程序链接到共享库,链接器就不会把目标模块拷贝到可执行文件中,而是在其中生成一条记录。一旦在运行时可执行文件载入内存,动态链接器确保找到动态库,随后实施运行时链接,解析主程序函数调用,并与共享库中函数定义关联。在运行时,内存中只需要保留一份,可供所有运行时的程序使用。  优点:节约内存,更新时是需要一次编译,随后其他程序编译时会自动链接新库
动态链接库:1、编译成动态链接库gcc struct.c -fPIC -shared -o libstruct.so2、链接动态链接库,生成可执行文件gcc main.c -L. -lstruct -o main3、设置库文件的环境路径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来确定库的名称。

转载地址:http://neqpi.baihongyu.com/

你可能感兴趣的文章
单例模式
查看>>
工厂方法模式
查看>>
模板方法模式
查看>>
数据结构之队列、栈
查看>>
数据结构之树
查看>>
数据结构之二叉树
查看>>
二叉树非递归遍历算法思悟
查看>>
红黑树算法思悟
查看>>
从山寨Spring中学习Spring IOC原理-自动装配注解
查看>>
实例区别BeanFactory和FactoryBean
查看>>
Spring后置处理器BeanPostProcessor的应用
查看>>
Spring框架的ImportSelector到底可以干嘛
查看>>
Mysql中下划线问题
查看>>
微信小程序中使用npm过程中提示:npm WARN saveError ENOENT: no such file or directory
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
Vue项目中使用img图片和background背景图的使用方法
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>