596 字
3 分钟
fork、exec 和 wait 分别做什么
  1. 1操作系统面试学习路线与知识地图
  2. 2什么是用户态和内核态
  3. 3什么是系统调用?它和普通函数调用有什么区别
  4. 4进程和线程有什么区别
  5. 5进程的五种状态:新建、就绪、运行、阻塞与终止
  6. 6fork、exec 和 wait 分别做什么本文
  7. 7什么是竞态条件和临界区?如何保证互斥
  8. 8互斥锁和自旋锁有什么区别?分别适合什么场景
  9. 9死锁的四个必要条件是什么?如何逐个预防
  10. 10缺页异常如何处理?虚拟内存不等于 Swap
  11. 11阻塞、非阻塞、同步、异步 I/O 怎么区分
  12. 12抢占式调度是什么?SJF 和 MLFQ 适合什么假设
  13. 13进程间通信如何选择?管道、共享内存、信号和 Socket
  14. 14线程切换时,操作系统要做哪些操作
  15. 15进程上下文切换要保存什么?为什么有开销
  16. 16死锁是什么?如何预防和避免死锁?
  17. 17银行家算法如何避免死锁?死锁检测后怎样恢复
  18. 18活锁、饥饿和死锁有什么区别
  19. 19进程调度算法:FCFS、SJF、优先级、时间片轮转与多级反馈队列
  20. 20调度指标有哪些?什么是优先级反转
  21. 21为什么要有虚拟内存
  22. 22TLB、多级页表和虚拟地址转换是怎么工作的
  23. 23什么是分段,什么是分页
  24. 24页面置换算法有哪些?FIFO、LRU 和 Clock
  25. 25信号量是什么?计数信号量和二元信号量怎么用
  26. 26条件变量是什么?为什么要和互斥锁配合使用
  27. 27进程间通信方式:管道、消息队列、共享内存、信号量与套接字
  28. 28I/O 模型有哪些:阻塞、非阻塞与多路复用
  29. 29select、poll 和 epoll 有什么区别
  30. 30epoll 的 LT 和 ET 模式有什么区别
  31. 31什么是异步 I/O?它和非阻塞、多路复用的区别
  32. 32什么是僵尸进程和孤儿进程?如何处理
  33. 33原子操作是什么?原子性、可见性和有序性有什么区别
  34. 34什么是工作集和抖动?内存不足时为何系统变慢
  35. 35mmap 是什么?文件映射和匿名映射怎么理解
  36. 36什么是写时复制?fork 和私有映射如何利用 COW

在 Unix/Linux 编程中,fork() 创建一个子进程;成功时父进程得到子进程 PID,子进程得到 0,失败返回 -1。子进程从 fork 返回处继续执行,初始时拥有与父进程相似的地址空间视图、文件描述符等资源状态。现代 Linux 通常通过写时复制避免立刻复制所有物理页,但父子进程仍是独立进程,后续写入会获得各自的私有副本。

exec 系列调用把当前进程的用户程序映像替换为另一个程序:地址空间内容、代码和数据等被新映像取代,但进程身份通常保留,文件描述符默认也保留,除非设置了 close-on-exec。exec 成功不会返回旧程序;失败才返回错误。因此常见模式是 fork 子进程,然后子进程 exec 启动目标程序,父进程继续工作或等待。

wait() / waitpid() 让父进程取得子进程终止状态并回收其退出记录。子进程退出后,内核仍需暂存 PID、退出码等信息供父进程读取;父进程 wait 后这些记录才释放。父进程不一定必须立刻等待,但长期不回收会留下僵尸记录。

fork 后父子文件描述符可能指向同一个打开文件描述(共享文件偏移和状态标志);这不等于所有资源都完全共享。多线程进程 fork 的子进程只保留调用 fork 的线程,其他锁的状态处理复杂,因此子进程通常应尽快 exec,不能随意调用任意非异步信号安全的库函数。

常见追问#

Q:fork 会把整个进程内存复制一遍吗?
A:语义上子进程获得独立的私有地址空间视图;实现通常采用写时复制,只有页面被写入时才复制,具体实现属于操作系统细节。

Q:exec 后 PID 会改变吗?
A:通常不会。exec 替换当前进程执行映像,不创建新进程;创建子进程的是 fork 等机制。

Q:为什么 shell 常用 fork 加 exec?
A:shell 需要保留自身以继续接收命令,因此让子进程运行新程序,父 shell 可等待前台子进程,也可继续处理后台任务。

fork、exec 和 wait 分别做什么
https://blog.xqcherry.top/posts/interview/operating-system/fork-exec-wait/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0