主要函数:

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保证子进程先运行的更多相关文章

  1. linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程

    本节目标: 复制进程映像 fork系统调用 孤儿进程.僵尸进程 写时复制 一,进程复制(或产生)      使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文.进程堆栈. ...

  2. 进程控制fork与vfork

    1. 进程标识符 在前面进程描述一章节里已经介绍过进程的两个基本标识符pid和ppid,现在将详细介绍进程的其他标识符. 每个进程都有非负的整形表示唯一的进程ID.一个进程终止后,其进程ID就可以再次 ...

  3. APUE学习之进程控制 - fork 与 vfork

    最后编辑: 2019-11-6 版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 一.进程标识 每一个进程都有一个唯一的非 ...

  4. 关于fork( )函数父子进程返回值的问题

    fork()是linux的系统调用函数sys_fork()的提供给用户的接口函数,fork()函数会实现对中断int 0x80的调用过程并把调用结果返回给用户程序. fork()的函数定义是在init ...

  5. fork后父子进程文件描述问题

    [fork后父子进程文件描述问题] 一张图可以浅析的解释: 参考:http://wenku.baidu.com/view/dd51581bff00bed5b9f31d8e.html

  6. 怎么查看一个进程里fork多少个子进程

    怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 ? ? ?

  7. linux系统编程:进程控制(fork)

    在linux中,用fork来创建一个子进程,该函数有如下特点: 1)执行一次,返回2次,它在父进程中的返回值是子进程的 PID,在子进程中的返回值是 0.子进程想要获得父进程的 PID 需要调用 ge ...

  8. 【Linux 进程】之关于父子进程之间的数据共享分析

    之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...

  9. APUE8进程控制 fork vfork exec

随机推荐

  1. Android http通信案例

    Android studio 编写安卓程序,实现 http 通信,获得百度主页源代码. -------------------------------------------------------- ...

  2. sublime3 离线安装插件

    直接去:https://packagecontrol.io/installation搜索插件,插件一般会有个git网址(格式化html的插件可以用这个:https://github.com/victo ...

  3. HDU1540 Tunnel Warfare(线段树区间维护&求最长连续区间)题解

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. 【文件readonly异常】异常退出编译文件,再次进入提示readonly

    1.对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时,会出现如下提醒: 这是由于已经打开但未闭关的文件,会在其目录下出现一个.swp的文件,由于是属于隐藏文件,可以用命令l.  ...

  5. Codeforces Round #528 div1

    完了,看来上一次的flag要应验了,我大概是真的要掉成pupil了吧.. A - Connect Three 这个就是找到x的中间值,y的中间值,然后切一下,然后把所有的点挂到这条边上.但是我做的还是 ...

  6. [bzoj1571][Usaco2009 Open]滑雪课Ski

    题目描述 Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S<=100 ...

  7. C#用Linq查询Combox的数据源

    https://www.cnblogs.com/sufei/archive/2010/01/12/1645763.html var result =  ((DataTable) (this.ComSh ...

  8. Linux 操作 mysql

    linux mysql 操作命令 [转 来源] 1.linux下启动mysql的命令:mysqladmin start/ect/init.d/mysql start (前面为mysql的安装路径) 2 ...

  9. 【Coursera】SecondWeek(2)

    The First Two Packets on the Internet Leonard Kleinrock Kleinrock 是一名工程师和计算机科学家,他在APRANET网络中起到了至关重要的 ...

  10. Ubuntu14.04 libboost_program_options.so.1.54.0: cannot open shared object file: No such file or directory

    macname@ubuntu:~/Desktop$ roslaunch blackrospack: error : cannot open shared object file: No such fi ...