fork函数与多进程并发访问服务器

本文介绍了Linux中的fork函数,详细讲解了如何创建子进程,以及子进程与父进程的区别。同时,探讨了多进程服务器的概念,强调了其在并发访问中的应用,虽然存在进程通信和资源管理的挑战,但多进程模型提供了明确的地址空间隔离,减少了潜在的错误。文章还提到了孤儿进程和僵死进程的情况,以及父进程如何通过wait或waitpid函数处理子进程的善后工作。
摘要由CSDN通过智能技术生成

目录

  • 子进程与父进程
  • fork()函数
  • 多进程服务器

子进程与父进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。子进程指的是由另一进程(对应称之为父进程)所创建的进程
子进程通常通过父进程调用fork()函数产生,调用fork()后,操作系统会复制一个与父进程几乎完全相同的子进程,这两个进程共享代码空间(即文本段),但是数据空间是互相独立的

fork()函数

函数原型及所需的头文件如下

#include <unistd.h>
pid_t fork(void);

fork意为分叉,fork()函数用来创建一个子进程,并返回pid_t类型的进程ID

fork()函数调用时不需要参数,但是会返回两个返回值分别返回给父进程和子进程,父进程返回子进程的进程ID,子进程返回0,fork()函数执行后可以通过判断返回值判断父子进程,每个进程也可以通过调用getpid()函数获得自己的进程号,也可以通过getppid()获得自己父进程的进程号

值得注意的是,子进程拥有父进程当前运行到的位置(两进程的程序计数器PC值相同,即子进程是从fork返回处开始执行的),不过fork()创建进程之后子进程与父进程谁先开始运行是完全随机的,可以通过进程间通信(IPC)解决父子进程的同步问题

创建子进程后,父进程需要等待子进程的退出并为其善后:

如果父进程在子进程退出之前退出了,这时候子进程就变成了孤儿进程。当然每一个进程都应该有一个独一无_的父进程,init进程就是这样的-个“慈父”,Linux内核中所有的子进程在变成孤儿进程之后都会被init进程"领养”,这也意味着孤儿进程的父进程最终会变成init进程;如果一个已经终止但其父进程尚未对其进行善后处理(获取终止子进程的有关信息如CPU时间片、释放它锁占用的资源如文件描述符等)的进程被称僵死进程(zombie),ps命令将僵死进程的状态打印为Z

。那么父进程如何为子进程善后呢?

父进程通常通过调用wait()函数为子进程善后
wait()与waitpid()

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

当一个进程正常或异常退出时,内核就会向其父进程发送SIGCHLD信号。因为子进程退出是一个异步事件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值