![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux
文章平均质量分 90
Linux系统编程和Linux网络编程
头发没有代码多
这个作者很懒,什么都没留下…
展开
-
Linux——IP协议2
全球主流的IP地址IPV4,共四十多亿IP地址, 每个国家的IP地址,在开始的时候,就已经被划分好了,国际上的路由器都有自己的路由表,可以进行国家和国家的转发。所以,我们需要将IP进行划分,之后就有了各种网络划分的方案。IP地址分为两个部分, 网络号(可表征不同区域)和主机号。不同的子网其实就是把网络号相同的主机放到一起.如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复网络号是标识网段的重要依据。原创 2023-06-28 10:07:30 · 379 阅读 · 0 评论 -
Linux——IP协议1
13位分片偏移:是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。报文长度是1500字节,分成三份,第一个片偏移量0,第二个500,第三个1000.更多分片是1代表该分片后面还有分片:如下面这张图里更多分片是1,1,0。虽然有分片,但分片行为不是主流,能一次交付就尽量一次交付。原创 2023-06-11 15:17:31 · 841 阅读 · 0 评论 -
Linux——TCP协议2
我们所要的是对方的接收缓冲区大小,我们可以通过交换报文获取对方的缓冲区大小,在三次握手的时候我们可以进行交换报文,在三次握手的前俩次是不能携带数据的,因为三次握手没有完成,但是可以交换双方的缓冲区的大小,三次握手就是在交换双方的报文(数据段),因为TCP报头有窗口大小,只不过该数据段没“有效载荷”。TCP根本不关心发的是什么,只负责把数据发过去,不对报文做任何解释,如之前写的网络计算器,\r\nlength x y \r\n,这种格式是我们在应用层定制的,TCP根本不关心格式,只负责把数据发过去。原创 2023-06-04 08:50:53 · 673 阅读 · 0 评论 -
Linux——TCP协议1
TCP通信的时候,客户端发送信息既不能太快也不能太慢,如何保证发送方发送数据既不快又不慢呢?服务器把自己的同步接收能力告诉客户端,而服务器的接收能力又由什么决定?接收缓冲区中剩余空间的大小。根据对方接收能力,控制数据发送速度,这种策略叫流量控制。16位窗口大小就是接收缓冲区剩余空间大小。16位窗口大小中填的是自己的接收缓冲区大小。这是TCP报头当中的6个标记位6个标记位:是按照1个比特位表示某种含义的,为什么需要多个标记位?我们可能会给对方发送各种类型的TCP报文。原创 2023-06-03 09:52:28 · 656 阅读 · 0 评论 -
Linux——Udp与Tcp协议
TCP报头里有一个4位首部长度(包括20字节和选项长度), 范围:0000~1111即0~15,单位是4字节,即共60字节,整个TCP报头最大是60字节,具体是多少要看选项长度,4位首部长度范围(在标准20字节的基础上)即【5,15】,即【0101,1111】,如果报头没有带选项,4位首部长度就是0101。无法判定报文和报文的边界,也不需要判定,TCP只需要把所收到的所有数据拿走,剩下的交给上层,至于数据在2进制字节流当中,该如何被解释这是由应用层关心的。每一个报文,一定是携带了完整报头的TCP报文。原创 2023-06-02 14:40:22 · 420 阅读 · 0 评论 -
Linux——https2
3.无状态(http并不会记录一个用户上一次的请求,http协议不会对用户的行为做记录),但是我们登录一些网站,如CSDN时,第一次需要输入账户密码和信息,当我们关闭网页之后,再次打开CSDN就发现用户已经登陆好了,即免去了让用户频繁登录的行为。表达:收集用户的数据,把数据推送给服务器,当用户想提交数据给服务器,必须依托于网页的表单,表达的作用提供输入框和提交按钮,之后表达中的数据会被转成http请求的一部分,表达是需要被提交的,提交的时候要指明提交方法。2.把客户端的数据提交到服务器,POST,GET。原创 2023-06-01 18:25:03 · 593 阅读 · 0 评论 -
Linux——https
加密就是把明⽂(要传输的信息)进⾏⼀系列变换,⽣成密⽂.解密就是把密⽂再进⾏⼀系列变换,还原成明⽂.在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进⾏这个过程,这样的数据称为密钥(正确发⾳yue四声,不过⼤家平时都读作yao四声数字指纹(数据摘要),其基本原理是利⽤单向散列函数(Hash函数)对信息进⾏运算,⽣成⼀串固定⻓度的数字摘要。数字指纹并不是⼀种加密机制,但可以⽤来判断数据有没有被窜改。原创 2023-05-31 10:04:08 · 574 阅读 · 0 评论 -
Linux——http协议2
3.无状态(http并不会记录一个用户上一次的请求,http协议不会对用户的行为做记录),但是我们登录一些网站,如CSDN时,第一次需要输入账户密码和信息,当我们关闭网页之后,再次打开CSDN就发现用户已经登陆好了,即免去了让用户频繁登录的行为。表达:收集用户的数据,把数据推送给服务器,当用户想提交数据给服务器,必须依托于网页的表单,表达的作用提供输入框和提交按钮,之后表达中的数据会被转成http请求的一部分,表达是需要被提交的,提交的时候要指明提交方法。2.把客户端的数据提交到服务器,POST,GET。原创 2023-05-30 15:16:10 · 639 阅读 · 0 评论 -
Linux——http协议1
应用层:就是程序员基于socket接口之上编写的具体逻辑,做的很多工作,都是和文本处理有关的——协议分析与处理。http协议,一定会有大量的文版分析和协议处理。原创 2023-05-29 09:56:48 · 726 阅读 · 0 评论 -
Linux——序列和反序列化2
上一篇提到了json,即我们不自己写序列化和反序列化。用json里面得序列化和反序列化。当我们换成fastwriter,fastwriter和stylewriter格式不同。引入了json库之后,在makefile里面要加这个选项。下面代码的演示效果,json版的序列化和反序列化。我们这里写一个简单的代码演示一下这个库的用法。我们对结果的表达式再优化一下。我们在使用库的时候带上路径。json库的路径如下。原创 2023-05-28 16:37:42 · 76 阅读 · 0 评论 -
Linux——应用层之序列号与反序列化
TCP协议通讯流程tcp是面向连接的通信协议,在通信之前,需要进行3次握手,来进行连接的建立。当tcp在断开连接的时候,需要释放连接,4次挥手。原创 2023-05-28 09:04:51 · 754 阅读 · 0 评论 -
Linux——网络套接字3|Tcp客户端编写②
根据我们前面写的服务器,server端需要绑定,而client要不要bind呢?不需要,因为客户端一旦和一个非常具体的端口号绑定,可能会导致端口号绑定多个客户端,因此可能会出现某个客户端无法启动。而服务器需要明确的端口号,因为服务器面对的是众多的客户端,服务器端口号一旦被改,所有客户端可能会无法连接服务器。即,服务器端口号一经采纳便不再改变。虽然客户端不需要bind,但一定需要端口号,这里让OS自动选择进行端口号选择。对于客户端最需要的是连接别人的能力。这里用的端口叫connect。原创 2023-05-27 08:57:02 · 825 阅读 · 0 评论 -
Linux——网络套接字2|Tcp服务器编写
本篇博客先看后面的代码,再回来看上面这些内容。.hpp文件,基本调用服务器基本框架接下来用tcp的方式创建套接字,我们用SOCK_STREAM因为TCP是面向连接的,所以当我们通信的时候需要建立连接,原创 2023-05-26 10:19:51 · 1429 阅读 · 0 评论 -
Linux——网络套接字1|socket编程
IP地址(公网IP),标定了主机的唯一性。通常情况,把数据送到对方的机器是目的吗?不是的,真正的网络通信过程其实是进程间通信,如客户端进程和服务器进程,我们把数据在主机间转发仅仅是手段,机器收到数据之后,需要将数据交付给指定的进程,当客户端有多个进程在运行时,OS又是如何把数据传送给指定进程的?这个跟端口号有关。认识端口号端口号(port)是传输层协议的内容端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;原创 2023-05-25 15:08:45 · 1035 阅读 · 0 评论 -
Linux——网络基础1
所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域网.操作系统内部存在着多种协议,那么操作系统要管理这些协议吗?是,管理方式:先描述,再组织。协议本质就是软件,软件是可以分层的。协议在设计的狮虎,就是被层状划分的。为什么要划分称为层状结构?答:一般要面对的场景比较复杂,可以进行功能解耦(每层可解决不同的问题),便于人们进行各种维护,因此网络协议也是层状结构。通信的复杂,本质是和距离成正相关的。复杂体现在哪里?原创 2023-05-24 10:23:08 · 576 阅读 · 1 评论 -
Linux——线程7|线程池
上面的代码可能会遇到这种情况,多个线程同时调用getThreadPool,当第一个线程用if语句判断时,可能被切走,被且走后第二个线程进来,通过了if判断,然后new出对象,此时第一个线程又被切回来,但这个时候已经在执行new代码了,影刺可能会出现new重复执行的情况,所以我们上面的代码并不是线程安全的。代码这样改,当再想获取单列的时候,先进行判断而不是加锁,当后续的线程来的时候ptr已经不为空了,直接进行返回,避免了中间的多次加解锁。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。原创 2023-05-22 09:09:10 · 318 阅读 · 0 评论 -
Linux——线程6
我们在访问线性结构时用下标进行访问,下标从0开始,最后一个下标是n,实际元素个数是n+1,如果这里让index去访问线性结构,当访问到下标为n的位置时,index++,此时要访问下标为0的元素,这里我们用index%=(n+1),即用模运算来模拟环状结构,因为这里有n+1个元素,所以模n+1。我们可以用一个格子来进行判断,如果当前位置的下一个位置下标为0,则说明满了,则在这个格子中不放入任何的数据,即为空的时候,俩者都指向同一个位置,为满的时候,生产者指向最后一个位置,消费者指向第一个位置。原创 2023-05-21 15:11:42 · 541 阅读 · 0 评论 -
Linux线程5——生产消费模型
当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞),这里的阻塞队列就是交易场所。生产消费模型效率提高体现在:当消费者要花很多时间处理数据时,当消费者正在处理数据的时候,他并没有访问锁,因为这个数据已经被拿到了消费者线程的上下文当中,所以,此时生产者线程可以生产数据甚至把数据放到仓库里,因此,实现了俩个线程的并发,提高了俩个线程的并发度,效率提高就体现在了这里。生产者和消费者角色由线程承担,也就是给线程角色化。原创 2023-05-20 08:53:00 · 601 阅读 · 0 评论 -
Linux——线程4|线程同步
同步:主要是为了解决访问临界资源合理性问题的(如抢票的时候不能只让一个进程把所有的票抢走),同步是按照一定的顺序,进行临界资源的访问。原创 2023-05-19 11:27:34 · 432 阅读 · 0 评论 -
Linux——线程3|线程互斥和同步
我们单个申请一把锁是原子的,当一把锁申请完再去申请另一把锁,可能会出问题,如这里的线程A,B,俩个同时运行线程A拿锁1,线程B拿锁2,接下来线程A申请锁2,线程B申请锁1,此时就会出现问题,双方想要的锁都被对方拿到。当执行完第一条语句之后,线程有可能被切换,线程被切走的时候是带着数据走的,走的时候带走了寄存器里放进去的0,当新线程来了之后,新线程照样从第一句语句开始执行(这是加锁操作必须的),新线程把0放了进来,也就是说此时俩个线程都有0,进而说明,寄存器是共享的,但寄存器里面的内容是私有的。原创 2023-05-18 21:14:39 · 451 阅读 · 0 评论 -
Linux——线程1
若我们已经创建好一个进程,此时再创建进程,此时就会有俩套task_struct,mm_struct,页表我们想在一个进程的基础上,在创建一个进程,而且这个新的进程只创建PCB(task_struct),这个PCB指向父进程对应的地址空间。我们想以上面这种方式创建多个进程,而且通过一定的技术手段,将当前进程的“资源”,以一定的方式划分给不同的task_struct(如多个进程执行不同的代码)。而且对于CPU来说,这么多PCB不会影响到CPU。原创 2023-05-14 09:23:18 · 216 阅读 · 1 评论 -
Linux——线程2|线程控制
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流线程的优点创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多。原创 2023-05-15 09:48:53 · 506 阅读 · 2 评论 -
Linux——进程信号1
信号和信号量是俩个东西,俩者无关系。原创 2023-05-11 21:18:15 · 430 阅读 · 0 评论 -
Linux——进程信号2
在进程终止的时候,帮我们执行设定好的用户返回调用。当执行进程切换的代码时:当进程时间片到了,操作系统底层硬件发送时钟中断,由于当前进程还在CPU上,操作系统在CPU中找到当前正在执行的进程,然后通过该进程的地址空间找到对应的切换进程的函数,然后在进程的上下文中进行切换,因此能直接访问该进程在CPU中的临时数据,然后所有的临时数据被压倒PCB当中,进而把进程放下去,然后选择一个进程再上来,操作系统继续使用下一个进程3-4G的地址空间和内核级页表,然后恢复上下文代码和数据,然后把上一个进程恢复上来。原创 2023-05-12 14:55:42 · 660 阅读 · 1 评论 -
Linux——进程信号3
内核如何实现信号的捕捉信号捕捉的方法出了我们之前的signal之外,还有其它方法sigactionsigaction:检查或更改一个信号的动作即捕捉信号第一个参数,要捕捉的信号对应的编号,第二个参数:结构体(这个结构体类型名和函数名一样,这里不是回调这个函数),该类型是输入型参数,第三个参数 输出型参数,对于这个信号的老的处理方法,类似于sigprocmask。成功返回0,失败返回-1,并设置错误码sigaction结构体第一个是信号捕捉对应的回调函数,第2,4,5个参数暂时不考虑。原创 2023-05-13 08:47:44 · 427 阅读 · 0 评论 -
Linux——进程间通信3
当n一开始是5,client进行n--,减完之后,n还未返回内存,client执行流就被切走,之后执行了好几个进程,使n变为了1,n变为1之后,client又被切回来,client此时将上次被切走时的n(4),直接返回内存,n从1直接变为了4,这就是时许问题。由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。(该说法有点不准确)2.我们把自己的进程,访问临界资源的代码称为临界区。原创 2023-03-15 15:03:09 · 371 阅读 · 1 评论 -
Linux——进程间通信2
每一个进程0-3G属于用户,3-4G属于内核,页表分为用户级和内核级页表,操作系统在进行调度或使用系统调用接口或库函数,都要将在自己的代码映射到自己的地址空间当中,因为动态库会加载到共享区,无论我们是执行库中的代码或操作系统中的代码,都是在自己的地址空间中完成,无论进程如何切换,每个进程3-4G的空间全部映射的是操作系统的代码和数据。我们此时让写端运行起来,当读端读到z的时候不会退出,会一直读,一直打印z,也就是无法执行后面的删除程序,我们需用ipcrm -m shimd手动去删除。原创 2023-03-13 09:28:06 · 765 阅读 · 1 评论 -
Linux——进程间通信1
每个进程都有一个自己的文件描述符表,进程内部有files*指针,指向自己的文件描述符表,文件描述符表都有自己的数组下标,0,1,2是标准输入,标准输出,标准错误流,linux下一切皆文件,没个文件都有自己的struct_file结构,struct_file不仅包含inode属性,也包含文件对应的内核缓冲区,这个缓冲区在内核中对应的结构叫address_space。4.管道是基于文件的,文件的生命周期时随进程的,管道的生命周期是随进程的(如果父子进程在使用管道通信,通信双方退出,管道会被自动释放)原创 2023-03-10 10:49:54 · 936 阅读 · 14 评论 -
Linux——动态库
静态库的代码在链接的时候会被拷贝进对应的可执行程序内部,动态库则不需要拷贝。动态库在形成目标文件时,需要加一个选项-fPIC:形成一个与位置无关的二进制文件(动态库在哪都无所谓,静态库会被拷贝到具体某个特定位置)readelf -S mymath.o:可读取mymath.o对应的二进制内容接下来形成动态库前缀lib后缀.so,shared让形成一个动态库编写makefile,上面是形成动态库,下面是形成静态库,这里同时生成俩个库make之后,既有静态库又有动态库进行发布。原创 2023-01-26 20:17:46 · 1182 阅读 · 25 评论 -
猿创征文| Linux——基础I/O3| 缓冲区|自己设计缓冲区实现文件操作|minishell重定向
会强制刷新缓冲区,刷新是一个写的过程,在return 0的时刻会发生写时拷贝,刷新是写的过程,父子进程要保证独立性,发生了写实拷贝。fflush是C语言提供的接口,这是因为在fork之前强制刷新了缓冲区,刷新的时候给fflush传入stdout就能刷新,stdout跟缓冲区好像没关系,fflush中传的参数是FILE*类型,因为在C语言中,打开一个文件返回值是FILE*,FILE结构体除了封装了fd之外,还封装了缓冲区结构。同样一个文件向显示器打印4行,向文件打印7行,C接口打印俩次,系统接口打印一次。原创 2022-11-09 21:48:26 · 903 阅读 · 33 评论 -
Linux——innode
inodeTable:inode是一个大小为128字节的空间,里面保存的是对应文件的属性,该块组内,所有文件的inode空间的集合,需要标识唯一性,每一个inode块,都要有一个inode编号。一般而言一个文件,一个inode,一个inode编号。data block中,不是所有的data block,只能存文件数据,也可以存其它块的块号,当文件内容较大时,会有一个或多个块信息,这些信息指向其它的数据块,而我们通过找到其它的数据块就能找到文件内容,这就是对于较大文件的存储方式。原创 2023-01-23 10:54:13 · 2328 阅读 · 41 评论 -
Linux——基础IO(上)|语言层面如何访问文件|什么是一切皆文件|C语言文件操作复习|什么是当前路径|系统接口的使用|open|close|write|read|文
Linux认为一切皆文件,硬件等设备也是文件。显示器:printf/cout->本质是写入output键盘:scanf/cin->本质是读input读写都是站在内存的角度。站在系统的角度,能够被input读取,或者能够output写出的设备就叫文件,文件也包括显示器,键盘,网卡,声卡,显卡,磁盘。几乎所有的外设,都可以称之为文件当我们把myfile拷贝到上一级目录之后运行,我们发现上一级目录也有log.txtlog.txt是进程创建的写一个死循环进行观察myfile的pid是11174。原创 2022-10-21 15:11:03 · 639 阅读 · 37 评论 -
Linux——基础I/O2-操作系统如何访问文件|文件描述符的分配规则|重定向|如何理解一切皆文件
用C语言实现面向对象,让结构体里面包含成员方法,使用函数指针,底层不同的文件,对应着不同的操作方法,下面这些设备都是外设,所以每一个设备的核心访问函数,都可以是read,write(这俩个代表I/O),所有的设备都可以有自己的read和write,但是,代码的实现,一定是不一样的,这种方式下硬件没有任何的差别,看待所有的文件的方式都统一成了struct file。操作系统用struct file进行管理文件,里面包含了文件的所有内容,包含属性,但文件的属性又来自哪?所以,本质上,文件描述符就是该数组的标。原创 2022-10-26 15:16:25 · 544 阅读 · 17 评论 -
Linux——将环境变量导入自己写的shell
这是因为我们把完整的子字符串保存在了cmd__line中,打散后的字符串保存在了g_garp中,每次添加环境变量的时候不是把环境变量对应的字符串拷贝到指针数组对应的空间中,而是把字符串的地址添加到指针数组当中,虽然我们切割了子串,但是子串的内容还是保留在了cmd_line中,而g_argv其实是保存了切割后的子串的地址,当我们下一次执行循环的时候,环境变量被清空,环境变量的地址可能没变,但是cmd_line已经被清空,所以下次再打的时候就成了NULL。导入了环境变量,但是此时exit=0,说明导入失败了。原创 2022-10-13 08:50:40 · 1007 阅读 · 25 评论 -
Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?父进程先退出,子进程就称之为“孤儿进程”孤儿进程被1号init进程领养,当然要由init进程回收。写一份代码测试孤儿进程一开始子进程是4222,父进程是4221当父进程退出后,4222的父进程变为1被回收会子进程的程序还在运行,屏幕仍然在滚动,我们输入kill -9 4222 即可杀掉子进程总结:父进程退出,子进程还在,子进程就叫孤儿进程,孤儿进程会被1号进程领养(init,系统本身)领养的目的是为了回收子进程。原创 2022-10-01 16:41:07 · 1406 阅读 · 8 评论 -
Linux——进程控制2|进程程序替换|替换原理|替换函数|替换函数创建子进程|其余替换函数介绍|使用替换致函执行其它文件程序|使用替换致函执行其它语言文件|execlp |
exec系列函数的功能其实iu是加载器的底层接口path:文件路径+文件名argv:指针数组,最后要以NULL结尾execv中的v可看作vector方便记忆。file:文件名(要执行谁),execlp,p代表会在path环境中查找arg:命令行模式下使用格式,命令行参数必须以NULL结尾file:文件名(你要执行谁)argv:指针数组还有execv系列函数名带l(list) : 表示参数采用列表v(vector) : 参数用数组。原创 2022-10-08 08:48:36 · 248 阅读 · 4 评论 -
Linux——操作进程状态
我们让程序睡一会,运行之后程序是S+状态输入kill -19 PID,程序变为T状态,T状态是停止状态,这就说明S可中断T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。D状态:睡眠状态,磁盘睡眠,深度睡眠,不可被中断,不可以被被动唤醒当服务器压力过大的时候,OS会通过一定的手段,杀掉一些进程,来起节省空间的作用dd命令能够演示D状态进程。原创 2022-09-29 10:23:44 · 1541 阅读 · 27 评论 -
Linux——进程|描述进程-PCBtask_struct-PCB的一种组织进程 |查看进程父进程和子进程|PID获取|父子关系|fork初识
课本概念:程序的一个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。进程:对应的代码和数据+PCB结构体。原创 2022-09-27 08:07:38 · 892 阅读 · 39 评论 -
Linux——进程控制1|再谈fork()|fork常规用法和调用失败原因|进程终止|main函数返回值|exit和_exit|相同点|不同点 |总结 |进程等待
exit最后也会调用_exit, 但在调用_exit之前,还做了其他工作1. 执行用户通过 atexit或on_exit定义的清理函数。2. 关闭所有打开的流,所有的缓存数据均被写入3. 调用_exitprintf不加\n数据保存在“缓冲区”当中,这个缓冲区一定不在操作系统内部,如果是操作系统维护的,缓冲区_eixt也能刷新,该缓冲区只能在库函数,如C标准库父进程通过wait/waitpid可以拿到子进程的退出结果(退出码和推出信号), 不能用全局变量来代替退出码。原创 2022-10-07 08:58:43 · 845 阅读 · 8 评论 -
Linux——程序地址空间|验证地址空间分布|地址空间|问题探讨fork()|一个变量怎么保存不同的值扩展 |为什么要有地址空间的三大理由|理由1 理由2 理由3
但是当子进程修改数据的时候,为了保证进程的独立性(互不影响),操作系统识别到子进程修改变量时,会给子进程重新开辟一块空间,并把上面的值拷贝过来,然后修改一下子进程的映射关系,完成更改后这俩个的虚拟地址不受影响,但物理内存不一样,所以打出来的一样时因为打出来的是虚拟地址。所以进程的独立性,可以通过地址空间+页表的方式实现。因为有地址空间的存在,每一个进程都认为自己有4GB的空间(32),并且各个区域是有序的,进而可以通过页表映射到不同的区域,来实现进程的独立性,每个进程也不知道其它进程的存在。原创 2022-10-05 08:38:56 · 511 阅读 · 56 评论