目录
1. fork() 函数
功能
使用时注意事项
2. exit() 函数
功能
使用时注意事项
3. wait() 函数
功能
使用时注意事项
总结
wait()
异常信号结束
waitpid
exec函数族
execl()
execlp()
execv
execvp
fork()、exit() 和 wait() 函数在进程管理中扮演着重要的角色,它们之间的关系密切,了解它们的行为和使用方法对于编写可靠的多进程程序非常重要。下面是它们的基本功能、关系以及使用时需要注意的事项:
1. fork() 函数
功能
fork()用于创建一个新的子进程。调用fork()后,父进程和子进程都会继续执行fork()之后的代码。- 在子进程中,
fork()返回 0,而在父进程中,fork()返回子进程的 PID。
使用时注意事项
- 错误处理:
fork()如果失败,会返回 -1。要检查并处理这个错误。 - 资源管理:子进程会复制父进程的内存空间,虽然这是高效的(写时拷贝),但要注意资源的合理分配和释放。
- 进程隔离:子进程和父进程是相互独立的,它们可以有不同的执行路径和数据。
2. exit() 函数
功能
exit()用于终止当前进程的执行,并返回一个状态码。状态码通过exit()函数的参数传递给操作系统。- 子进程调用
exit()后会立即终止,其资源会被操作系统回收,且其退出状态会传递给父进程。
使用时注意事项
- 退出状态:状态码可以通过
WEXITSTATUS(status)从wait()或waitpid()获取,用于检查子进程的退出情况。 - 清理资源:在调用
exit()之前,确保所有打开的文件描述符和动态分配的内存得到妥善处理,以避免资源泄漏。
3. wait() 函数
功能
wait()用于使父进程等待一个或多个子进程结束。它会阻塞,直到一个子进程终止,并获取子进程的终止状态。waitpid()是wait()的一个变体,允许更精细的控制,指定等待特定的子进程或使用非阻塞模式。
使用时注意事项
- 避免僵尸进程:如果父进程不调用
wait()或waitpid(),子进程终止后会成为僵尸进程,直到父进程处理它们。调用wait()可以避免僵尸进程。 - 多子进程管理:在处理多个子进程时,建议使用
waitpid()以控制等待特定子进程的退出。 - 处理子进程状态:
wait()和waitpid()返回的状态信息可以通过WIFEXITED(status)和WEXITSTATUS(status)进行检查,以判断子进程是否正常退出及其退出状态。
总结
- 创建子进程:使用
fork()创建子进程。子进程会从fork()返回处开始执行,父进程也会继续执行。 - 终止进程:子进程使用
exit()终止自己,并返回状态码给操作系统。父进程可以通过wait()或waitpid()等待子进程结束,并获取其退出状态。 - 资源回收:正确使用
wait()或waitpid()避免僵尸进程,确保系统资源得到有效管理。
通过正确使用这些函数,可以实现有效的进程管理,确保多进程程序的稳定性和可靠性。
wait()
父进程使用wait后会等待子进程消亡后再跳转到wait位置开始回收后执行父后面程序。



异常信号结束

waitpid
一直循环扫描检测,直至程序正常结束。

练习
exec函数族
execl()
会搜索当前目录

execlp()
默认路径搜索系统路径,如果是系统命令(cat、ls 等)第一个可以输入”cat“就行,这就是与execl的区别,自己的可执行程序需要完整路径。


execv
会搜索当前路径,execv和execvp区别是函数第一个参数,路径直接写入和传入args[0]


execvp
只会搜索系统路径path



















