进程控制实验 本实验旨在加深对进程并发执行概念的理解,实践并发进程的创建和控制方法,观察和体验进程的动态特性,进一步理解进程生命期期间创建、变换、撤销状态变换的过程,并掌握进程控制的方法,了解父子进程间的控制和协作关系。 一、进程创建和控制 1.1 进程创建 通过系统调用 fork() 创建子进程,并和其子进程并发执行。子进程初始的执行映像是父进程的一个复本。子进程可以通过 exec() 系统调用族装入一个新的执行程序。 1.2 fork() 系统调用 fork() 系统调用语法:`pid_t fork(void);` fork() 成功创建子进程后将返回子进程的进程号,不成功会返回 -1。 1.3 exec() 系统调用 exec 系统调用有一组 6 个函数,其中示例实验中引用了 execve 系统调用语法: `int execve(const char *path, const char *argv[], const char *envp[]);` * path:要装入的新的执行文件的绝对路径名字符串。 * argv[]:要传递给新执行程序的完整的命令参数列表(可以为空)。 * envp[]:要传递给新执行程序的完整的环境变量参数列表(可以为空)。 Exec 执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。如果 exec 调用失败,它会返回 -1。 二、进程控制 2.1 wait() 和 waitpid() 系统调用 wait() 系统调用语法: `pid_t wait(int *status);` `pid_t waitpid(pid_t pid, int *status, int option);` * status:用于保留子进程的退出状态。 * pid:可以为以下可能值: + -1:等待所有 PGID 等于 PID 的绝对值的子进程。 + 1:等待所有子进程。 + 0:等待所有 PGID 等于调用进程的子进程。 + >0:等待 PID 等于 pid 的子进程。 * option:规定了调用 waitpid 进程的行为: + WNOHANG:没有子进程时立即返回。 + WUNTRACED:没有报告状态的进程时返回。 wait 和 waitpid 执行成功将返回终止的子进程的进程号,不成功返回 -1。 2.2 getpid() 和 getppid() 系统调用 getpid() 系统调用语法: `pid_t getpid(void);` `pid_t getppid(void);` getpid 返回当前进程的进程号,getppid 返回当前进程父进程的进程号。 三、信号控制 3.1 信号的概念 信号是由中断或异常事件引发的,如键盘中断、定时器中断、非法内存引用等。信号的名字都以 SIG 开头,例如 SIGTERM、SIGHUP。 3.2 信号的处理 信号可在任何时间发生,接收信号的进程可以对接收到的信号采取 3 种处理措施之一: * 忽略这个信号 * 执行系统默认的处理 * 捕捉这个信号做自定义的处理 信号从产生到被处理所经过的过程: 产生 -> 挂起 -> 派送 -> 部署 或忽略 3.3 信号掩码 一个信号集合是一个 C 语言的 sigset_t 数据类型的对象,sigset_t 数据类型定义在 `<signal.h>` 中。被一个进程忽略的所有信号的集合称为一个信号掩码(mask)。 3.4 发送信号 从程序中向一个进程发送信号有两种方法: * 调用 shell 的 kill 命令 * 调用 kill 系统调用函数 kill 能够发送除杀死一个进程(SIGKILL、SIGTERM、SIGQUIT)之外的其他信号,例如键盘中断(Ctrl+C)信号 SIGINT,进程暂停(Ctrl+Z)信号 SIGTSTP 等等。 调用 Pause 函数会令调用进程的执行挂起直到一个任意信号到来后再继续运行。 调用 sleep 函数会令调用进程的执行挂起直到一个指定的时间到来后再继续运行。
- 粉丝: 192
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助