Linux系统编程手册一 :Linux系统基本概念。

时间:2022-02-06 14:46:15

1.hard link与soft link :
hard link:硬链接,也叫正式链接,普通链接,文件名对应的是i-node节点,所以一个node节点可以对应多个文件名,删除一个,ref_count –,当减为0的时候,就彻底删除。
要注意,hard link不能对目录建立连接,必须对同一个文件系统的文件建立hard link.
soft link :软链接,符号链接, 其实就是一个文件,只不过这个文件的内容是另一个文件的路径名。可以对目录和其他文件系统的文件建立soft link。所以删除soft link对源文件一点影响都没有,也就是源文件不知道被soft link了。多数情况下,内核会自动解引用,如果指向的文件不存在,这就是一个空链接。
2.文件结束符 :unix系统没有文件结束符的概念,读取文件时没有数据返回,就会认定抵达文件末尾。
3.系统调用IO和stdio函数库的IO函数的的区别: unix系统I/O模型最为显著的特性之一就是I/O模型的通用性,不仅仅对应于文件,设备驱动也是用同样的(open(), read(), write(), close()等)。对于磁盘等设备,可以调用lseek()来随机访问。
另外stdio库对系统IO封装了一套IO函数,就是fopen(), fclose(), scanf(), printf(), fgets(), fputs()等。
IO系统的文件描述符fd,是一个非负整数,用来指带打开的文件。其中,由shell启动的进程通常会继承3个已经打开的fd,就是0(stdin),1(stdout),2(stderr).
4进程 :进程可以调用系统调用fork()来创建进程(pid),新创建的进程就是子进程,调用fork的进程就是父进程(ppid)。内核通过对父进程的复制来创建子进程。子进程可以调用execve()系统调用取加载并执行一个全新的程序,execve会销毁现在的文本段,数据段,栈段及堆段,并根据新程序的代码来生成新的段。
系统引导启动时,内核会创建一个init进程,这是所有进程的父进程。
5.环境列表: 每个进程都有一个环境列表, 即在进程用户空间中保存了一组环境变量,当fork创建进程时,子进程会继承父进程的环境变量,这也算是一种进程间通信。当进程调用exec函数替换当前正在运行的程序时,要么继承老程序的环境,要么在exec调用的参数中指定新环境并加以接收。
在shell中一般可以用export来声明环境变量 export NAME=ccjing
在shell中, ulimit命令可以修改资源的限制。
6.静态库和共享库
静态库:静态库是对已编译目标模块的结构化整合,要使用静态库中的函数,需要在编译链接的时候指定相应的库。主程序会对静态库中隶属与各目标模块中的函数加以引用,链接器在解析了引用情况后,会从库中抽取相应的模块,将其复制到最终的可执行文件中。这就是所谓的静态链接。
缺点:由于将所需要的模块都复制到可执行文件中,所以就造成了多份拷贝,占用内存空间。另外,如果库有更新,不仅仅需要重新编译静态库,还需要重新对所有用到这个库的主程序重新链接该库。
共享库: 也叫动态库,专门为了解决 静态库的缺点。将链接到共享库的时候,链接器不会把该库复制到可执行文件中,只是在可执行文件中加入了一条记录。一旦在运行时将可执行文件载入内存,动态链接器会确保将可执行文件的动态库找到,并载入内存,随后实施运行时链接,解析可执行文件中的函数调用,将其与共享库的函数定义关联起来,在运行时,在内存中只保留了一份。如果共享库有更新,只需要编译共享库,不需要对可执行文件做修改。可执行文件会自动链接最新的库。

内存映射
系统函数mmap()可以在其虚拟空间中创建出一个新的内存映射。映射主要分为两类:
1.文件映射:将文件的部分区域映射到虚拟内存,一旦映射完成,对文件该部分的访问就转化为对相应内存区域的访问。映射页面会自动按需从文件加载。
2.无文件与之对应的匿名映射: 其映射页面的内容会自动初始化为0。
由某一进程创建的映射可以和其他进程共享。共享的方法有两种,一是两个映射都映射到文件的同一个位置。二是fork函数创建进程的时候子进程继承附近成的映射。当两个或多个进程共享的页面相同时,一个进程对该位置内容的修改是否为其他进程所见,取决与创建mmap的时候传入的参数。如果传入的参数为私有,则修改的内容不会为其他进程看到,也没有实际写入文件。如果传入的标志为共享,则可以为其他进程看见,也会真实的写入文件。
内存映射的用途很多,比如以可执行程序的相应段来初始化进程的文本段。申请内存,文件I/O,以及进程间通信(通过共享映射通信)。

信号: 信号一般被称为软中断。进程收到信号,意味着有突发的情况发生。信号的类型很多,每一种标识不同的事件或情况。采用不同的整数来表示不同的信号,并以SIGXXXX形式来表示。
内核或者其他进程或者进程自身都可以向进程发送信号,例如,某些情况如用户按下ctrl-c,或者子进程退出,进程设定的定时器到期,进程尝试访问的地址无效等,内核都会向进程发送信号。在shell中,可以通过kill命令向进程发送信号,程序中可以通过kill()函数来实现相同功能。对待信号,可以选择忽略,或者使用默认处理函数,也可以自己设定信号处理函数,或者阻塞某些信号。

进程在shell中执行 在shell中执行命令时,每个命令会创建一个进程来执行。例如 ls -l | sort -k5n | less
就会创建三个进程,这三个进程通过管道实现进程间通信,三个进程同属一个进程组。

日期和时间
真实时间:日历时间,unix采用UTC时间,就是从1970年1月1日凌晨为起始点到现在额秒数。
进程时间:cpu时间,指的是自进程启动以来,所占用的cpu时间总量。可进一步将cpu时间划分为系统cpu时间和用户cpu时间。前者是指在内核模式中,执行代码所花费的时间,后者是指在用户空间中执行代码所花费的时间。
time命令会显示出真实时间,系统cpu时间和用户cpu时间

ccjing >time :
real0m0.000s
user0m0.000s
sys0m0.000s

/proc文件系统 :
Linux提供/proc文件系统。/proc文件系统是一种虚拟文件系统,mount在/proc目录下,提供一个指向内核数据结构的接口,此外,还能通过一组以/proc/PID命名的目录查看系统中运行各进程的相关信息。