【APUE | 08】进程控制
函数fork
博文链接:
1. 代码示例:
#include "apue.h"
int glob = ;
char buf[] = "a write to stdout\n";
int main(void)
{
int var;
int pid;
var = ;
if (write(STDOUT_FILENO, buf, sizeof(buf) - ) != sizeof(buf) - )
{
err_sys("write error!\n");
}
printf("before fork!\n");
if ((pid = fork())<)
{
err_sys("fork error!\n");
}
else if (pid == ) // this is child process for pid == 0
{
glob++;
var++;
}
else //this is parent process
{
sleep(); //wait for child finishing
}
printf("pid= %d,glob= %d,var= %d\n", getpid(), glob, var);
exit();
}
输出结果:

函数vfork
1. 代码示例
#include "apue.h"
int glob = ;
char buf[] = "a write to stdout\n";
int main(void)
{
int var;
int pid;
var = ;
if(write(STDOUT_FILENO, buf, sizeof(buf)-)!= sizeof(buf)-)
{
err_sys("write error!\n");
}
printf("before fork!\n");
if((pid = vfork())<)
{
err_sys("fork error!\n");
}
else if(pid == ) // this is child process for pid == 0
{
glob++;
var++;
_exit();
} printf("pid= %d,glob= %d,var= %d\n",getpid(),glob,var);
exit();
}
输出结果:

函数wait和waitpid
博文链接:
函数原型: pid_t waitpid(pid_t pid, int *status, int options);
pid:一共分为四种情况:
| pid 参数 | 解释 |
| < -1 | 等待组ID等于pid绝对值任一子进程 |
| == -1 | 为任意一个子进程收尸 |
| == 0 | 为与父进程同一个进程组中的任意一个子进程收尸 |
| > 0 | 为一个 PID 等于参数 pid 的子进程收尸 |
函数exec
进程程序替换
- 替换原理
fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任何一种)来执行另一个任务。当进程调用exec函数时,当前用户空间的代码和数据会被新程序所替换,该进程就会从新程序的启动历程开始执行。在这个过程中没有创建新进程,所以调用exec并没有改变进程的id。
- 替换图解

- 六个函数之间的关系
事实上,只有execve是系统调用,其他五个最终都调用execve。

#include "apue.h"
int glob = 6;
char buf[] = "a write to stdout\n";
int main(void)
{
int var;
int pid;
var = 88;
if(write(STDOUT_FILENO, buf, sizeof(buf)-1)!= sizeof(buf)-1)
{
err_sys("write error!\n");
}
printf("before fork!\n");
if((pid = vfork())<0)
{
err_sys("fork error!\n");
}
else if(pid == 0) // this is child process for pid == 0
{
glob++;
var++;
_exit(0);
} printf("pid= %d,glob= %d,var= %d\n",getpid(),glob,var);
exit(0);
}
#include "apue.h"
int glob = 6;
char buf[] = "a write to stdout\n";
int main(void)
{
int var;
int pid;
var = 88;
if(write(STDOUT_FILENO, buf, sizeof(buf)-1)!= sizeof(buf)-1)
{
err_sys("write error!\n");
}
printf("before fork!\n");
if((pid = vfork())<0)
{
err_sys("fork error!\n");
}
else if(pid == 0) // this is child process for pid == 0
{
glob++;
var++;
_exit(0);
} printf("pid= %d,glob= %d,var= %d\n",getpid(),glob,var);
exit(0);
}
【APUE | 08】进程控制的更多相关文章
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- [08]APUE:进程控制
[a] getpid / getppid / getuid / geteuid / getgid / getegid #include <unistd.h> pid_t getpid(vo ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- APUE(8)---进程控制(1)
一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度 ...
- 进程控制(Note for apue and csapp)
1. Introduction We now turn to the process control provided by the UNIX System. This includes the cr ...
- apue学习笔记(第八章 进程控制)
本章介绍UNIX系统的进程控制,包括创建新进程.执行程序和进程终止. 进程标识 每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符.下列函数返回这些标识符 #inc ...
- 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制
8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...
- 进程控制之exec函数
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行.因为调用exec并不创 ...
随机推荐
- 8、Python-函数
定义 def printInfo(): print("人生苦短,我用Python") 调用 def printInfo(): print("人生苦短,我用Python&q ...
- Hive记录-配置客户端可视化管理工具远程连接
配置客户端远程连接(方便可视化工具操作)-不需要在hive服务器上敲命令了 1.安装DBeaver工具:https://dbeaver.com/download/ 2.准备相关驱动文件(服务器上hiv ...
- 51Nod-1436 方程的解数
题目链接 题解链接 版权属于以上链接 #include <iostream> #define mod(a, m) ((a) % (m) + (m)) % (m) using namesp ...
- bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...
- 从面向对象的角度重新认识JS世界
一. 背景 距离上一篇JS文章已经20天,经重新总结发现,上一篇概况的有点浅显,适合初学js的入门了解,但对于已经学习js一段时间的人,或者是想系统的了解JS体系,接下来的文章可能会更有帮助. 该系 ...
- centos redis集群搭建
说明: 10.0.0.111部署6500,6501,6502三个主节点 10.0.0.222部署6500,6501,6502三个备份节点 1.安装redis:略 2.配置内核参数 # 配置 vm.ov ...
- 夏令时(DST)测试
夏令时测试是比较小众的测试,主要针对在有夏令时的国家使用的软件,如果你接触到了这方面的测试,说明你在挣国外的钱:). 话不多说,先来介绍下什么是夏令时: 夏时制,夏时令(Daylight Sa ...
- 《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略
第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收. 3.2 对象已死吗 ...
- asp.net mvc简单分页实例
@{ ViewBag.Title = "Index"; } @{ int pageIndex = (int)ViewBag.CurrentPage; int pageCount = ...
- mysql 原理 ~ checkpoint
一 简介:今天咱们来聊聊checkpoint 二 定义: checkpoin是重做日志对数据页刷新到磁盘的操作做的检查点,通过LSN号保存记录,作用是当发生宕机等crash情况时,再次启动时会查询ch ...