APUE 进程控制(上):从创建到终止

1、 进程创建2、 进程执行3、 进程等待4、 进程终止进程是操作系统中最基本的概念之一,并且将新程序映像加载到内存中并运行它。它会向其父进程发送一个 SIGCHLD 信号(表示子进程状态改变)。

进程是操作系统中最基本的概念之一,也是 Unix 系统中最重要的资源之一。在 Unix 系统中,每个进程都有一个唯一的 PID(进程标识符),可以通过 PID 来管理和控制进程。本文将介绍 APUE 中关于进程控制的内容,包括创建、执行、等待和终止等方面。

1. 进程创建

在 Unix 系统中,一个新的进程可以通过调用 fork() 函数来创建。fork() 函数会返回两次,在父子进程中分别返回 0 和子进程的 PID。父子进程之间共享代码段、数据段和堆栈段等资源,但是它们有各自独立的用户空间和内核空间。

除了 fork() 函数外,还有其他几种方式可以创建新的进程。例如,在 shell 中运行一个命令时,shell 会调用 exec() 函数族来替换当前程序映像,并且将新程序映像加载到内存中并运行它。

2. 进程执行

当一个新的程序开始执行时,它首先需要进行动态链接以及初始化工作(如全局变量初始化)。然后开始执行 main() 函数,并且按顺序处理 main() 函数内部包含的语句。当 main() 函数返回时,程序就会退出。

在 Unix 系统中,进程可以通过调用 exec() 函数族来执行其他程序。exec() 函数族包括 execl、execlp、execle、execv、execvp 和 execve 等函数。其中,前三个函数使用可变参数列表来传递参数,后三个函数使用指针数组来传递参数。

3. 进程等待

在 Unix 系统中,父进程可以通过调用 waitpid() 或 wait() 函数来等待子进程的结束。waitpid(pid, &status, options) 函数会阻塞父进程,并且返回已经结束的子进程的 PID;而 wait(&status) 函数则会阻塞父进程,并且返回任意一个已经结束的子进程的 PID。

APUE 进程控制(上):从创建到终止

当一个子进程结束时,它会向其父进程发送一个 SIGCHLD 信号(表示子进程状态改变)。如果父进程没有显式地捕获该信号,则操作系统默认处理方式是忽略该信号。

4. 进程终止

在 Unix 系统中,一个正在运行的程序可以通过调用 exit(status) 来正常终止自己。exit(status) 会将 status 值存储到内核中,并且通知操作系统当前程序已经退出了。

除了正常终止外,还有一些异常情况可能导致程序被迫终止。例如,程序执行了一个非法指令、访问了非法内存区域或者遇到了系统错误等。

本文介绍了 APUE 中关于进程控制的内容,包括进程创建、执行、等待和终止等方面。通过学习这些知识,我们可以更好地理解 Unix 系统中的进程模型,并且能够编写更加高效和稳定的程序。

最后,希望读者能够善用这些知识,并且在实际开发中不断提升自己的技能水平!