函数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】进程控制的更多相关文章

  1. (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. [08]APUE:进程控制

    [a] getpid / getppid / getuid / geteuid / getgid / getegid #include <unistd.h> pid_t getpid(vo ...

  3. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. (十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. APUE(8)---进程控制(1)

    一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度 ...

  7. 进程控制(Note for apue and csapp)

    1. Introduction We now turn to the process control provided by the UNIX System. This includes the cr ...

  8. apue学习笔记(第八章 进程控制)

    本章介绍UNIX系统的进程控制,包括创建新进程.执行程序和进程终止. 进程标识 每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符.下列函数返回这些标识符 #inc ...

  9. 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制

    8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...

  10. 进程控制之exec函数

    用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行.因为调用exec并不创 ...

随机推荐

  1. 8、Python-函数

    定义 def printInfo(): print("人生苦短,我用Python") 调用 def printInfo(): print("人生苦短,我用Python&q ...

  2. Hive记录-配置客户端可视化管理工具远程连接

    配置客户端远程连接(方便可视化工具操作)-不需要在hive服务器上敲命令了 1.安装DBeaver工具:https://dbeaver.com/download/ 2.准备相关驱动文件(服务器上hiv ...

  3. 51Nod-1436 方程的解数

    题目链接  题解链接 版权属于以上链接 #include <iostream> #define mod(a, m) ((a) % (m) + (m)) % (m) using namesp ...

  4. bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...

  5. 从面向对象的角度重新认识JS世界

    一. 背景  距离上一篇JS文章已经20天,经重新总结发现,上一篇概况的有点浅显,适合初学js的入门了解,但对于已经学习js一段时间的人,或者是想系统的了解JS体系,接下来的文章可能会更有帮助. 该系 ...

  6. centos redis集群搭建

    说明: 10.0.0.111部署6500,6501,6502三个主节点 10.0.0.222部署6500,6501,6502三个备份节点 1.安装redis:略 2.配置内核参数 # 配置 vm.ov ...

  7. 夏令时(DST)测试

    夏令时测试是比较小众的测试,主要针对在有夏令时的国家使用的软件,如果你接触到了这方面的测试,说明你在挣国外的钱:).   话不多说,先来介绍下什么是夏令时:   夏时制,夏时令(Daylight Sa ...

  8. 《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略

    第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收.   3.2 对象已死吗 ...

  9. asp.net mvc简单分页实例

    @{ ViewBag.Title = "Index"; } @{ int pageIndex = (int)ViewBag.CurrentPage; int pageCount = ...

  10. mysql 原理 ~ checkpoint

    一 简介:今天咱们来聊聊checkpoint 二 定义: checkpoin是重做日志对数据页刷新到磁盘的操作做的检查点,通过LSN号保存记录,作用是当发生宕机等crash情况时,再次启动时会查询ch ...