进程与fork与进程通信

每个执行程序运行起来就是开启一个进程,但是一个执行程序可以打开多次,即开启多个进程。比如打开两个qq。
fork()函数开启一个进程。如果返回值大于零,说明在父进程。如果返回值等于零,说明在子进程。
fork低层原理:
fork是把父进程克隆一个子进程出来,所以父进程中的数据都会拷贝到子进程的虚拟内存。

  • 分配虚拟内存
  • 把父进程所有数据拷贝到子进程中
  • 把子进程加入进程队列
  • 开始进程调度

写时复制:
fork出子进程后,并不是立即为子进程分配虚拟地址空间。而是把父进程的映射页拷贝到子进程的映射页,父进程和子进程的映射页指向相同的物理地址。只有当父进程或子进程修改某个数据时,才会为子进程修改这个数据的物理地址指向。极大地提高fork的效率。

注意事项:
1、父进程有可能在子进程结束之前先结束。若父进程先结束,则子进程就是孤儿进程。子进程的父进程变为init进程。
若子进程在父进程之前结束,则父进程需要回收子进程,否则子进程的0-4G虚拟内存虽然释放了,但是PCB不会被释放,子进程变为僵尸进程。
使用wait函数回收子进程,并且wait函数会使父进程阻塞,直到子进程结束回收。wait函数只能回收一个子进程,回收先结束的子进程。
waitpid只针对某一个子进程。
若要回收多个子进程可以使用while
while(wait());
如果成功回收,wait返回大于0 的值。
2、fork函数之前的变量,子进程拷贝和父进程一摸一样的一份。(读时共享,写时复制)
3、直接使用fork循环创建子进程,一定注意子进程在for循环内部,子进程会循环创建孙进程。一定要加break。如果不是父进程,让子进程跳出循环。
4、所有进程之间的文件描述符是同一套。即可以通过fd打开同一个文件。
5、mmap建立的映射区是进程共享的。

进程之间的通信

linux文件类型
-:文件
d:目录
l:符号链接
伪文件(不占用磁盘存储空间,属于临时文件,在内核缓冲区)
s:套接字
b:块设备
c:字符设备
p:管道

1、管道
管道内部是使用队列来实现的,一个进程往里写数据,另一个进程读数据。只能一端度,一端写。半双工通信。同一时刻只能读或写,不能同时读写。 并且管道只能在有公共祖先的进程之间通信。
匿名管道pipe,返回两个参数,写入描述符,读出描述符
int fd[2];
int succes=pippe(fd);
fd[0]为读出描述符,fd[1]为写入描述符。
父进程有读断和写断,子进程有读端和写端。父进程向子进程传输时,需 关闭父进程读端,子进程写端。
子进程向父进程传输时,需关闭父进程写端,子进程读端。
有名管道fifo
2、信号
3、共享内存mmap
在Linux中,每个进程都有属于自己的进程控制块(PCB)和地址空间(Addr Space),并且都有一个与之对应的页表,负责将进程的虚拟地址与物理地址进行映射,通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这块区域即共享内存。
在这里插入图片描述

4、本地套接字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值