Linux零起点之进程管理----c语言编程
进程 (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语言编程的更多相关文章
- 1164: 零起点学算法71——C语言合法标识符(存在问题)
1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: 10 ...
- Linux 源码阅读 进程管理
Linux 源码阅读 进程管理 版本:2.6.24 1.准备知识 1.1 Linux系统中,进程是最小的调度单位: 1.2 PCB数据结构:task_struct (Location:linux-2. ...
- linux 的服务与进程管理(二)
2.linux 的服务与进程管理 [2.1]系统启动流程 简单的介绍下linux的系统启动流程,方便我们深入了解linux操作系统,对排除linux系统故障进行帮助.启动流程虽然简单但背后还有着更加复 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Linux第九讲随笔 -进程管理 、ps aux 、
Linux第九讲1,进程管理 Linux在执行每一个程序时,就会在内存中为这个程序建立一个进程,以便让内核可以管理这个运行中的进程,进程是系统分配各种资源,进程调度的基本单位. 怎么查看进程 一.ps ...
- linux周期性计划任务 进程管理
周期性计划任务crontab命令系统服务:/etc/init.d/crond(crond必须启动才会生效)用户计划:/var/spool/cron/用户名默认的计划任务全局配置:/etc/cronta ...
- Linux快速入门教程-进程管理ipcs命令学习
使用Linux系统必备的技能之一就是Linux进程管理,系统运行的过程正是无数进程在运行的过程.这些进程的运行需要占用系统的内存等资源,做好系统进程的管理,对于我们合理分配.使用系统资源有非常大的意义 ...
- 『学了就忘』Linux系统管理 — 81、进程管理介绍
目录 1.进程与线程的概念 2.什么是进程管理 3.进程管理的作用 4.Linux进程的几种状态 5.进程与线程的关系 (1)线程与进程的关系 (2)总结 1.进程与线程的概念 来源百度百科: 进程( ...
- 【nodejs学习】3.进程管理及异步编程
进程管理 1.调用终端命令实现目录目录拷贝 var child_procress = require('child_procress'); var util = require('util'); fu ...
随机推荐
- PHP源码分析-变量
1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误
1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8 在安装的时候报错: -1ubu1604-amd64.deb 提示: ...
- 一个诡异的COOKIE问题
今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...
- 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值
一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...
- .NET面试题集锦①(Part一)
一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...
- Git学习笔记一:新建本地仓库及初始化
1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- SpringMVC初步
SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...
- 一步步学习javascript基础篇(7):BOM和DOM
一.什么是BOM.什么是DOM BOM即浏览器对象模型,主要用了访问一些和网页无关的浏览器功能.如:window.location.navigator.screen.history等对象. DOM即文 ...