函数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. centos7下安装redis的步骤

    原贴地址:https://www.cnblogs.com/zuidongfeng/p/8032505.html 我linux服务器上是这样启动的: cd /tool/redis/redis-3.2.8 ...

  2. javascript 伪数组与标准数组

    伪数组 1. 是一个对象 2. 必须有length 属性,length 值是number 类型 3. 如果这个对象的length 不为0,那么必须要有按照下标存储的数据 标准数组 判断数据是否是标准数 ...

  3. 图解项目管理流程:禅道&JIRA中的操作

    禅道作为优秀的国产开源项目管理软件,禅道集产品管理.项目管理.质量管理.文档管理.组织管理和事务管理于一体,完整覆盖了研发项目管理的核心流程.禅道的设计理念在于提供一体化的解决方案,流程图完整呈现了项 ...

  4. Codeforces 590D Top Secret Task

    D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  5. Spark2.1.0编译

    1.下载spark源码包 http://spark.apache.org/downloads.html 2.安装Scala与maven,解压spark源码包 安装Scala: tar zxf scal ...

  6. 六、uboot 代码流程分析---start.S

    6.1 _start 入口函数 6.1.1 vectors.S (arch\arm\lib) 从上一节可以知道,uboot 的入口函数为 _start .此 函数定义在 vectors.S (arch ...

  7. tarjan,树剖,倍增求lca

    1.tarjan求lca 思想: void tarjan(int u,int f){ for(int i=---){//枚举边 if(v==f) continue; dfs(v); //继续搜 uni ...

  8. Linux - 包不同安装方式

    rpm 软件包管理器 安装编译包好的二进制包 方式 rpm -ivh lynx # rpm安装 rpm -e lynx # 卸载包 rpm -e lynx --nodeps # 强制卸载 rpm -q ...

  9. 【加密】Md5Util

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Md5U ...

  10. C# 解决请求被中止:无法建立SSL / TLS安全通道问题

    在网上查了很多资料,基本是这么一个思路: 在通过 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); req.Method ...