函数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. groovy.lang.GroovyRuntimeException: Conflicting module versions

    在运行groovy的junit方法时,报了这个错误: java.lang.ExceptionInInitializerError at org.codehaus.groovy.reflection.C ...

  2. elementUI 表格设置表头样式

    eader-row-class-name 表头行的 className 的回调方法,也可以使用字符串为所有表头行设置一个固定的 className. Function({row, rowIndex}) ...

  3. SQL Server进阶(一)T-SQL查询和编程的背景

  4. Keil stm32 printf到Debug窗口

    使用JlinkV8+Keil41.在main.c输入以下代码 #include <stdio.h> #define ITM_Port8(n) (*((volatile unsigned c ...

  5. MSVCR120.dll丢失问题

    一.问题:丢失MSVCR120.dll 二.解决方法 到官网下载vcredist_x86.exe安装即可 地址:https://www.microsoft.com/en-us/download/det ...

  6. 解决idea中找不到程序包和找不到符号的问题

    问题如图: 解决方法: 将三处编码都设置成UTF-8,亲测有效 本人也是拜读大佬博客后解决的: http://www.cnblogs.com/wzhanke/p/4747966.html

  7. Oracle——存储过程的使用

    为什么使用存储过程? 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 存储过程的定义: 存储过程(Sto ...

  8. C# 对图片加水印

    using System; using System.Collections; using System.Data; using System.Linq; using System.Web; usin ...

  9. WinRar 压缩接压缩文件

    windows  WinRAR 定时压缩文件 命名当天时间 设置时间格式: set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" 指定 WinRAR ...

  10. Go 语言读书笔记

    Go语言的设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来.     Go语言,又称Golang,是Google开发的一款静态强类型.编译型.并发型,并具有垃圾回收机制的 ...