函数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. python---tornado初识(2)实现登录和发布文章

    # coding:utf8 # __author: Administrator # date: 2018/3/6 0006 # /usr/bin/env python import tornado.i ...

  2. 为什么要用redis

    服务端的程序如何去识别客户端的状态: http是没有状态的,比如说用户A访问了服务器程序,那服务器如何知道下一次访问的时候还是A呢,这里就要用到session, 这个session是服务器的sessi ...

  3. UEditor百度编辑器,工具栏自定义添加一个普通按钮

    根据网上前辈提供的,还真的不错,下面也整理一下 添加一个名叫“macros”的普通按钮在工具栏上: 第一步:找到ueditor.config.js文件中的toolbars数组,增加一个“macros” ...

  4. VMware虚拟机Mac OS X无法调整扩展硬盘大小的解决方案(转)

    使用VMware虚拟机搭建的MacOSX,在10.10以上可能会出现无法扩充磁盘大小的问题. 因为很多朋友在初次安装MacOSX的时候都默认选择40G的磁盘大小,结果用了没两天之后就发现磁盘不够用了. ...

  5. JavaScript之数值计算

    //两等长数组对应元素之间做减法运算[可拓展:基本运算(+/-*//)] function array_dif(length,arrayA,arrayB){ var array = new Array ...

  6. luogu P4360 [CEOI2004]锯木厂选址

    斜率优化dp板子题[迫真] 这里从下往上标记\(1-n\)号点 记\(a_i\)表示前缀\(i\)里面树木的总重量,\(l_i\)表示\(i\)到最下面的距离,\(s_i\)表示\(1\)到\(i-1 ...

  7. luogu P1593 因子和

    不要吐槽博主总做这些数论氵题 首先我们看到这种因数问题,果断质因数分解 所以当前数\(a=p_1^{k_1}*p_2^{k_2}...*p_m^{k_m}\) 可得\(a^b=p_1^{k_1*b}* ...

  8. 分享一款Markdown的css样式

    使用 本样式在这个样式的基础上做了一些修改, 主要是对于表格和代码块以及一些细节的修改. 主要目的是用在chrome的扩展 Markdown Preview Plus中, 替换其内置的样式. 由于 M ...

  9. nRFgo Studio 和 Nrfjprog 无法找到JLinkARM.dll的解决方法

    Segger在第一次安装的时候,会在注册表中添加安装路径的字段,nRF的两个软件就根据这两个注册表字段来寻找JLinkARM.dll.而当你卸载/更新Segger的时候,注册表的相关的字段是不会被修改 ...

  10. 详解.NET IL代码(一)

    本文主要介绍IL代码,内容大部分来自网上,进行整理合并的. 一.IL简介 为什么要了解IL代码? 如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以 ...