浅谈父子进程

通过Linux启动过程可以得知,所有进程都是init进程直接或者间接的fork出来的.

首先咱们来看看怎么创建子进程:

头文件 #include <unistd.h>

int fork(void);    //创建一个子进程(开辟和父进程相同空间)
返回值:-1失败,成功返回创建的子进程的Id

int vfork(void);   //创建一个子进程(共享父进程资源空间)
返回值:-1失败,成功返回创建的子进程的Id

  1. int pid = fork();
  2. int c = 0;
  3. if(pid == 0){      //返回值在子进程中为0;所以当等于0时就是在子进程中运行
  4. c++;
  5. printf("children,c=%d\n",c);
  6. }else if(pid > 0){    //返回值在父进程中就是子进程的PID号,所以大于0就是在父进程中执行
  7. c++;
  8. printf("father,c=%d\n",c);
  9. }else {                 //小于0,子进程创建失败
  10. printf("子进程创建失败\n");
  11. }

结果为:children,c=1

    father,c=1

因为是拷贝父进程的资源,所以变量c也被拷贝了一份到子进程,所以在父子进程中对变量c进行操作不会相互影响,而且父子进程谁先执行谁后执行由系统进程调度决定,而使用vfork()函数则会共享,而且需要注意的是vfork函数产生的子进程会被优先调度,父进程会等子进程运行结束以后才会被调用,而且子进程结束以后必须调用exit函数返回,否则进程异常退出.

  1. int c = 0;
  2. int pid = vfork();
  3. if(pid == 0){
  4. c++;
  5. printf("c c=%d\n",c);
  6. exit(0);      //调用该函数返回
  7. }
  8. if(pid > 0){
  9. c++;
  10. printf("f c=%d\n",c);
  11. }
  12. if(pid < 0){
  13. printf("子进程创建失败\n");
  14. }

运行结果为:c c=2;

      f c=3;

vfork函数使得父进程等待子进程完成工作后调用可以防止子进程成为僵尸进程,而且节约内存空间,所以在满足需求的情况下可以尽量选择vfork函数创建子进程.

------------------------------------------------------------------------------------------------

一些其他的相关函数:

头文件<sys/types.h>,<unsid.h>
int getpid(void);//得到进程Id
int getppid(void);//得到父进程Id

头文件<sys/types.h><sys/wait.h>
int wait(int *status);//暂停目前进程的执行,直到有信号来激活或者子进程执行结束
int waitpid(int pid,int *status,int options);
//等待pid代表的子进程的执行结束,pid = -1,相当于wait。等待任何子进程

头文件<unsid.h>
unsigned int sleep(unsigned int seconds)//当前进程休眠

头文件<unsid.h>
void exit(int status);//结束进程,更新缓存区
oid _exit(int status);//结束进程,清空缓存区

时间: 2024-10-11 01:26:04

浅谈父子进程的相关文章

谈父子进程执行过程

fork函数用于从已存在进程中创建一个新进程,新进程成为子进程,原进程成为父进程.这两个进程分别返回他们各自的返回值, 其中父进程的返回值是子进程的进程号,子进程则返回0,因此返回值大于0标识父进程,等于0标识子进程.所以我们可以通过返回值 来判定该进程是父进程还是子进程.fork函数创建新进程后的父子进程模型如下: 下面用一个简单程序来观察父子进程之间的运行过程: 该代码运行结果如下: 由上述程序可以将父子进程的执行看做如下过程:

浅谈守护进程和守护线程

线程是由进程开启的,当开启线程的进程离开时,该线程也自然而然的去了. 一般情况下, Python 中的多线程操作有两种方式: 1.函数式 创建一个活动函数,将函数当做参数传入,然后用 threading 模块: threading.Thread(target = 函数名,args = (a,b)) 2.继承 去继承一个来自 threading.Thread 的类,功能写在 self.run() 中 方法1: from threading import Thread import time def

Linux01-Linux进程管理浅谈43

一.进程相关概念 1.OS运行 Kernel和 process(进程): 2.内存地址: 线性内存 物理内存 3.CPU: a)x86CPU执行环: 第0环是执行特权命令(最内圈): 第1和2环是没使用的: 第3环是用户的运行程序(最外圈): b)程序运行采用轮流替换的方式,这种方式可以有优先级控制,由内核主导运行: 4.内核运行机制: a)内核空间和用户空间; b)内核空间中的内核数据结构: task structure(任务结构),信息: PPID: PID:7 Name:Jerry c)进

浅谈操作系统之进程管理

详解本文前,先来说说什么是操作系统吧,要不,大家可能都不知道自己在看些什么.下图,可以非常形象的表示操作系统及它的相关内容.本文主要详细介绍一下操作系统的进程管理功能. 上图可以看出,操作系统是位于计算机硬件和应用软件之间的,有效组织和管理系统中各种软.硬件资源.它通过资源管理,提高了计算机系统的效率:也改善了人机界面,不需要我们直接面对简单且复杂的0和1了,向用户提供了友好的工作环境.下面来细说说进程管理吧. 首先,我们需要了解,什么是进程,与其相关的,什么又是线程?进程,可以认为它就是程序的

【转】浅谈Nginx负载均衡与F5的区别

前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问本地门户,动态数据则通过反向代理指向内网服务. 其实Nginx和F5这两者均可用作网站负载均衡,那二者有什么区别呢?笔者在此浅谈下Nginx与F5的一些区别. 目前很多网站或应用在设计之初都会为高并发的数据请求做负载均衡,不差钱的土豪用户一般会直接买F5硬件设备作为其负载均衡器,原因不用多

浅谈 Java Printing

浅谈 Java  Printing 其实怎么说呢?在写这篇博文之前,我对java printing 可以说是一无所知的.以至于我在敲文字时, 基本上是看着api文档翻译过来的.这虽然看起来非常的吃力,但是我相信,有道大哥不会辜负我的.嘻 嘻! Java Printing 技术,也就是我们平时所接触的打印,只不过是说可以用Java实现而已. 一.Java Printing 打印简介 Java Printing API能够使java应用程序实现相关的打印功能,如: 1.打印所有 Java 2D 和

浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等 servlet容器处理jsp.1.2.ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器.由于Nginx 超越 Apache 的高性能和稳

浅谈C中的malloc和free

在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用——就是malloc然后free就一切OK了.当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以 写下这篇文章作为一个对知识的总结.这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助! 如果不扯得太远的话(比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等),我感觉这篇文章应该是比较

浅谈城市规划在移动GIS方面的应用发展

1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规划动态方面提供了极大的便利,各类以无线终端.智能设备.网络通信和移动GIS核心技术的深入发展,可以为规划人员和决策者提供在线离线.定位实时.现状历史等方面分析服务,从而提高城乡规划工作效率. 2.移动GIS技术选型 从目前移动设备发展的情况来看,有Apple.三星.国内手机产品.平板:从操作系统上看