进程 (Process)是指操作系统中被加载到内存中的、正在运行的应用程序实例。进程是系统资源分配的基本单元,在其生命周期内会使用系统中的各种资源。进程主要由程序、数据以及进程控制快(PCB)3个部分组成。关于其基本知识和其状态相关的知识就不介绍了。下面来看看进程的创建和操作吧。

  当然,Linux系统中创建进程的函数调用很多(如:system()、popen()等等),此处,主要介绍下fork()函数:

/* Clone the calling process, creating an exact copy.
Return -1 for errors, 0 to the new process,
and the process ID of the new process to the old process. */
extern __pid_t fork (void) __THROWNL;

  用户可以通过Linux系统提供的fork()来创建多个子线程一实现多个不同任务的并发执行。若创建成功,则从子线程返回0,从父线程返回大于0的正整数(即子线程的惟一标识符id),否则返回-1,表示创建失败。

  操作系统内核为完成fork()调用执行的有以下操作:(1)为新进程分配一进程表项和进程标识符,操作系统会检查系统是否有足够的资源来建立一个新进程(2)检查同时存在且正在运行的进程数目,若超过预先规定的最大进程数目,fork()系统调用将会失败。(3)拷贝进程表项中的数据,将父进程的当前记录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。(4)子进程继承父进程的所有文件(5)为子进程创建进程上下文(6)执行子进程,虽然父进程和子进程程序完全相同,但每个进程都有自己的程序计数器PC,并根据fork()返回值的不同,执行不同的分支语言。因此,可以确定fork()是通过复制当前进程来创建新进程的。

#include<stdio.h>
#include<unistd.h>
int main()
{
int pid;
pid=fork();
while(pid==-);//创建子进程直到成功为止
if(pid)
{
printf("子进程\n");
sleep(); }
else
{
printf("父进程\n");
sleep();
}return ;
}

程序运行结果:子进程  或者   父进程

       父进程            子进程

  从进程并发执行来看,2种情况都有可能,因为父子进程没有同步机制,所以父进程与子进程的输出内容会叠加在一起,输出次序带有随机性。

  

下面我们继续对Linux中父子进程对程序的共享与私有部分

(1)父进程创建子进程后,父子进程各自分支中的部分规个自私有,其余部分(包括创建前和分支结束后的程序段)都为父子进程共享。先面看个例子:

#include<stdio.h>
#include<unistd.h>
int main()
{
int p;
putchar('X');
while((p=fork())==-);
if(p==)
{
putchar('B');
}
else
putchar('A');
putchar('Y');
return ;
}

运行结果:XAYXBY或XBYXAY

(2)如果子进程在其分支结束处使用exit()系统调用来终止自身的执行,则不会在共享其后的程序段。

(3)对于父子进程不共享的程序段,它们都有各自不同的进程映像,在自己的私有存储空间对数据进行修改不会影响到对方。

#include<stdio.h>
#include<unistd.h>
int main()
{
int p;
int x=;
while((p=fork())==-);
if(p==)
{
x=;
printf("child:x=%d\n",x);
}
else
printf("parent:x=%d\n",x);
return ;
}

运行结果:child:x=9

     parent:x=1

Linux进程树

  如果一个程序中使用了多个fork()调用,而且每次都不对返回值加以判断,不分析父子进程各自的程序空间,则后面的fork()调用为父子进程所共享,即父子进程返回时都会执行,从而使得家族的进程关系变得复杂。

#include<stdio.h>
#include<unistd.h>
int main()
{
fork();
fork();
fork();
putchar('A');
return ;
}

运行结果:AAAAAAAA

家族树图稍后上传。。

  先面我们在进一步看fork()&&fork()||fork():

此处涉及到逻辑运算符运行的机制和对fork()的更深层次了解与认识。其实此式新创建进程4个,下面来分析下:

A&&B 如果A=0,则就没必要执行B了,如果A!=0,则就执行B;

A||B 如果A=0则就执行B,如果A!=0则就不用执行B了。

  由此可见fork()&&fork()||fork()创建了4新进程,同理,类此问题迎刃而解。。。

Linux零起点之进程管理----c语言编程的更多相关文章

  1. 1164: 零起点学算法71——C语言合法标识符(存在问题)

    1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 10 ...

  2. Linux 源码阅读 进程管理

    Linux 源码阅读 进程管理 版本:2.6.24 1.准备知识 1.1 Linux系统中,进程是最小的调度单位: 1.2 PCB数据结构:task_struct (Location:linux-2. ...

  3. linux 的服务与进程管理(二)

    2.linux 的服务与进程管理 [2.1]系统启动流程 简单的介绍下linux的系统启动流程,方便我们深入了解linux操作系统,对排除linux系统故障进行帮助.启动流程虽然简单但背后还有着更加复 ...

  4. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  5. Linux第九讲随笔 -进程管理 、ps aux 、

    Linux第九讲1,进程管理 Linux在执行每一个程序时,就会在内存中为这个程序建立一个进程,以便让内核可以管理这个运行中的进程,进程是系统分配各种资源,进程调度的基本单位. 怎么查看进程 一.ps ...

  6. linux周期性计划任务 进程管理

    周期性计划任务crontab命令系统服务:/etc/init.d/crond(crond必须启动才会生效)用户计划:/var/spool/cron/用户名默认的计划任务全局配置:/etc/cronta ...

  7. Linux快速入门教程-进程管理ipcs命令学习

    使用Linux系统必备的技能之一就是Linux进程管理,系统运行的过程正是无数进程在运行的过程.这些进程的运行需要占用系统的内存等资源,做好系统进程的管理,对于我们合理分配.使用系统资源有非常大的意义 ...

  8. 『学了就忘』Linux系统管理 — 81、进程管理介绍

    目录 1.进程与线程的概念 2.什么是进程管理 3.进程管理的作用 4.Linux进程的几种状态 5.进程与线程的关系 (1)线程与进程的关系 (2)总结 1.进程与线程的概念 来源百度百科: 进程( ...

  9. 【nodejs学习】3.进程管理及异步编程

    进程管理 1.调用终端命令实现目录目录拷贝 var child_procress = require('child_procress'); var util = require('util'); fu ...

随机推荐

  1. PHP源码分析-变量

    1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误

    1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8   在安装的时候报错: -1ubu1604-amd64.deb 提示: ...

  4. 一个诡异的COOKIE问题

    今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...

  5. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  6. .NET面试题集锦①(Part一)

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...

  7. Git学习笔记一:新建本地仓库及初始化

    1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...

  8. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  9. SpringMVC初步

    SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...

  10. 一步步学习javascript基础篇(7):BOM和DOM

    一.什么是BOM.什么是DOM BOM即浏览器对象模型,主要用了访问一些和网页无关的浏览器功能.如:window.location.navigator.screen.history等对象. DOM即文 ...