进程控制fork vfork,父子进程,vfork保证子进程先运行
主要函数:
fork 用于创建一个新进程
exit 用于终止进程
exec 用于执行一个程序
wait 将父进程挂起,等待子进程结束
getpid 获取当前进程的进程ID
nice 改变进程的优先级
---------------------------------
孤儿进程:
如果一个子进程的父进程先于子进程结束,子进程就成为一个孤儿进程,他由init进程收养,成为init进程的子进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> int main()
{ pid_t pid;
pid = fork(); switch( pid )
{
case :
{
while()
{
printf("child pid:%d, parent pid:%d\n", getpid(), getppid());
sleep();
}
}
case -:
{
printf("create child process error\n");
exit(-);
}
default:
{
sleep();
printf("I am parent,pid:%d\n", getpid());
exit();
} } return ; }
child pid:9670, parent pid:9669
child pid:9670, parent pid:9669
child pid:9670, parent pid:9669
I am parent,pid:9669
root@wilson-software:~/Project/xa# child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
从输出结果来看,父进程停止后,子进程变成了孤儿进程,此时子进程的父进程ID 是 1,
(init进程的进程ID值始终是1)由init进程收养。
------------------------------------------------------------------------------
vfork函数创建一个子进程时,操作系统并不将父进程的地址空间完全复制到子进程,用vfork函数创建的子进程共享父进程的地址空间,
也就是说子进程完全运行在父进程的地址空间上。子进程对该地址空间中任何数据的修改同样为父进程所见。
使用fork创建一个子进程时,哪个进程先执行取决于系统的调度。
而vfork创建一个子进程时,vfork保证子进程先运行,子进程调用exec或者exit之前父进程处于阻塞等待状态。
如果在调用exec或者exit之前子进程要依赖父进程的某个行为,就会导致死锁。
如果创建子进程的目的只是为了调用exec执行某个程序,那么fork过程中子进程对父进程地址空间的复制将会是一个多余的过程。
vfork不会拷贝父进程的地址空间,这大大减小了系统开销。
使用vfork时要谨慎,最好不要允许子进程修改与父进程共享的全局变量和局部变量
-------------------------------------------------------------------------------------------------------------------------------------------------
父子进程结束的先后顺序不同会产生不同的结果:
父进程先退出,子进程后退出,则系统会让init进程接管子进程。
当子进程先退出,而父进程又没有调用wait函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启。子进程处于僵死状态时,内核只保存该进程的
一些必要信息以备父进程所需。此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数。如果子进程先于父进程结束,并且父进程调用了wait或waitpid函数,
则父进程会等待子进程。
进程控制fork vfork,父子进程,vfork保证子进程先运行的更多相关文章
- linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程
本节目标: 复制进程映像 fork系统调用 孤儿进程.僵尸进程 写时复制 一,进程复制(或产生) 使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文.进程堆栈. ...
- 进程控制fork与vfork
1. 进程标识符 在前面进程描述一章节里已经介绍过进程的两个基本标识符pid和ppid,现在将详细介绍进程的其他标识符. 每个进程都有非负的整形表示唯一的进程ID.一个进程终止后,其进程ID就可以再次 ...
- APUE学习之进程控制 - fork 与 vfork
最后编辑: 2019-11-6 版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 一.进程标识 每一个进程都有一个唯一的非 ...
- 关于fork( )函数父子进程返回值的问题
fork()是linux的系统调用函数sys_fork()的提供给用户的接口函数,fork()函数会实现对中断int 0x80的调用过程并把调用结果返回给用户程序. fork()的函数定义是在init ...
- fork后父子进程文件描述问题
[fork后父子进程文件描述问题] 一张图可以浅析的解释: 参考:http://wenku.baidu.com/view/dd51581bff00bed5b9f31d8e.html
- 怎么查看一个进程里fork多少个子进程
怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 ? ? ?
- linux系统编程:进程控制(fork)
在linux中,用fork来创建一个子进程,该函数有如下特点: 1)执行一次,返回2次,它在父进程中的返回值是子进程的 PID,在子进程中的返回值是 0.子进程想要获得父进程的 PID 需要调用 ge ...
- 【Linux 进程】之关于父子进程之间的数据共享分析
之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...
- APUE8进程控制 fork vfork exec
随机推荐
- 20145312 《网络对抗》 Web安全基础实践
20145312 <网络对抗> Web安全基础实践 问题回答 SQL注入攻击原理,如何防御 原理:攻击者在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,把SQL语句当做 ...
- 20145331魏澍琛《网络对抗》Exp8 Web基础
20145331魏澍琛<网络对抗>Exp8 Web基础 实践内容: 1.简单的web前端页面(HTML.CSS等) 2.简单的web后台数据处理(PHP) 3.Mysql数据库 4.一个简 ...
- 面向对象之(非)绑定方法,反射,isinstance与issubclass
isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查obj是否是类 cls 的对象 class Foo(object): pa ...
- vim 操作快捷键 待更~
shift + g 文件尾 ------ gdb p print start 从main函数开始 n next换行 s step 进入函数
- opencv-python 学习初探2 去图片水印
我要去除的水印是红色的.网上已经有很不错的帖子,我就不贴自己的代码了.留个指路自己以后查资料. 大概的思路就是用颜色拾取工具,拾取水印颜色,分析了图片,找到规律.比如我的图片水印是红色的,红色差不多g ...
- MOOC视频学习
mooc地址 2018/2/6-2/7学习计划: 学习第一周(1.1-1.4)内容. 学习笔记 2018/2/8-2/9学习计划: 学习第二周(1.5.2.1-2.5)内容. 学习笔记 2018/2/ ...
- POJ 1018 Communication System(DP)
http://poj.org/problem?id=1018 题意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产,而每个厂家生产 ...
- python-ConfigParser模块--转载
1,函数介绍 1.1.读取配置文件 -read(filename) 直接读取ini文件内容-sections() 得到所有的section,并以列表的形式返回-options(section) 得到该 ...
- WPF基础学习笔记整理 (二) XAML
基础知识: XAML:Extensible Application Markup Language, zammel: 用于实例化.NET对象的标记语言: XMAL使用树形逻辑结构描述UI: BAML: ...
- async 和 await的前世今生 (转载)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...