复制进程fork与替换进程exec

本文介绍了进程复制中的fork函数,阐述了其工作原理和返回值情况,以及如何处理僵死进程。此外,讨论了写时拷贝的概念及其作用,并提到了进程控制块(PCB)的内容和作用。最后,区分了并发与并行执行的区别,并简单说明了如何使用GDB调试跟踪子进程。

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

(1)fork复制进程的过程:
一个现有进程可以用fork()函数通过系统调用创建一个新进程
#include <unistd.h>
pid_t fork(void);
// 返回:若成功则在子进程中返回0,在父进程中返回子进程PID,若出错则返回-1
fork调用仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值-1;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的PID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
(2)僵死进程的概念:子进程先于父进程结束,父进程没有调用wait()获取子进程的退出码。
僵死进程的处理方法:
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。
写时拷贝: 写的时候(改变字符串的时候)才会真正的开辟空间拷贝(深拷贝),如果只是对数据的读时,只会对数据进行浅拷贝。(深拷贝:增加了一个指针,并新开辟了一块空间,让指针指向这块新开辟的空间。浅拷贝:增加了一个指针,指向原来已经存在的内存)(浅拷贝:在多个对象指向一块空间的时候,释放一个空间会导致其他对象所使用的空间也被释放了,再次释放便会出现错误)

实现原理: 引用计数器的浅拷贝,这个技术是通过“引用计数”实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加1,当要释放这块空间时,引用计数减1(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为这个指针分配自己的空间(注意这时引用计数的变化,旧的空间的引用计数减1,新分配的空间引用计数加1)。

作用: 要知道一共有多少个对象指向它,就需要就一个计数器,多一个对象指向它,就让计数器++ 析构一个指向这段空间的对象,就让这个计数器- -,如果计数器为0,那么就释放这段空间,否则就会造成内存泄漏。
进程控制块pcb:系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一 一对应的
作用:使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。
包含的内容:
(1)进程标识符(唯一)
(2)进程当前状态,通常同一状态的进程会被放到同一个队列;
(3)进程的程序和数据地址
(4)进程资源清单。列出所拥有的除CPU以外的资源记录。
(5)进程优先级。反应进程的紧迫程度
(6)CPU现场保护区。记录中断时的CPU状态
(7)进程队列的PCB的链接字。
(8)进程相关的其他信息。占用CPU多长时间等。
并发运行与并行:
并发:指应用能够交替执行不同的任务,其实并发有点类似于多线程的原理,多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已.
并行:指应用能够同时执行不同的任务
二者的区别:
并发是交替执行,并行是同时执行。
如何调试跟踪子进程?
l(list) ,显示源代码,并且可以看到对应的行号;
b(break)x, x是行号,表示在对应的行号位置设置断点;
p(print)x, x是变量名,表示打印变量x的值
r(run), 表示继续执行到断点的位置
n(next),表示执行下一步
c(continue),表示继续执行
q(quit),表示退出gdb

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值