博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux进程相关
阅读量:4341 次
发布时间:2019-06-07

本文共 2741 字,大约阅读时间需要 9 分钟。

1. 进程

进程是程序的一个执行实例,指令+执行上下文 = 进程。

每个进程被分配给一个进程号作为唯一标识,系统维护一个进程表,每个表项保存了一个进程的相关信息。32位CPU的寻址范围是4G所以通常一个进程的逻辑地址空间是4G,其中有1G是属于内核代码段,其余属于用户代码段和数据段。

2. 进程的启动和创建

2.1 system 函数启动线程

2.2 exec 系列函数 :代替当前执行的进程

2.3 fork函数:复制新进程

  当在进程A中执行系统fork函数时,进程表会创建一个新的表项,拥有一个唯一的进程ID,也就是进程号(PID),进程表项的其他值大部分与进程A的相同,具体说来,就是新进程B和A共享代码段,并且B将A的数据空间,堆栈等复制一份 ,然后从A创建B的地方开始运行

  从代码的角度看,创建一个新进程的fork函数原型为:

pid_t pid = fork(void);

   fork函数被包含在unistd.h文件中,pid_t 是进程号类型,通常是32位整数,fork函数的返回值,如果是在被创建的子进程中进行检测,则返回值为0,若在父进程中检测,则为子进程id,若创建失败则返回负数。

  有如下代码段:

  

#include 
#include
using namespace std;int main(int argc, char* argv[]){ printf("before fork...\n"); int iTestValue = 0; pid_t id = fork(); if (id < 0) { printf("fork error..."); } else if (id == 0) { iTestValue ++; printf("in child process...|%d\n", iTestValue); printf("in child process...|%d\n", getpid()); printf("in child process...|%d\n", getppid()); } else { iTestValue ++; printf("in parent process...|%d\n", iTestValue); printf("in parent process...|%d\n", getpid()); printf("in parent process...|%d\n", getppid()); } printf("after fork...\n"); return 0;}

  程序输出:

  

  其中函数getpid()返回当前进程id,getppid()返回当前进程的父进程id,父进程创建子进程和创建后两个进程执行的过程如下图所示:

  

  另外,fork失败,会返回负数,这通常是由于系统作了最大进程数目限制CHILD_MAX,相应的errno(全局变量,需#include<errno.h>)是EAGAIN. 如果没有足够的空间资源,errno会是ENOMEM,关于系统的最大进程数目限制:

  

3. 进程等待

  头文件wait.h中的函数wait方法会导致父进程阻塞等待子进程执行完毕。这个调用会返回该子进程的PID。如果有错误,返回-1,错误码保存在errno中。函数原型为:

pid_t wait(int* stat_loc);

用宏WIFEXITED(stat_loc)判断子进程是否正常退出;

用宏WEXITSTATUS(stat_loc)返回子进程的退出码。

    对上述测试代码修改为:

  

#include 
#include
#include
#include
using namespace std;int main(int argc, char* argv[]){ printf("before fork...\n"); int iTestValue = 0; pid_t id = fork(); if (id < 0) { printf("fork error..."); } else if (id == 0) { iTestValue ++; printf("in child process...|%d\n", iTestValue); printf("in child process...|%d\n", getpid()); printf("in child process...|%d\n", getppid()); } else { int stat_val; pid_t child_id = wait(&stat_val); if (WIFEXITED(stat_val)) { printf("exit code:|%d\n", WEXITSTATUS(stat_val)); iTestValue ++; printf("in parent process...|%d\n", iTestValue); printf("in parent process...|%d\n", getpid()); printf("in parent process...|%d\n", getppid()); } } printf("errno:|%d\n", errno); printf("after fork...\n"); return 0;}

  输出:

  

  可以看出,wait方法使得父进程创建了子进程之后便一直等待直到子进程执行完毕才继续执行。

  

 

转载于:https://www.cnblogs.com/litterrondo/archive/2013/04/27/3047231.html

你可能感兴趣的文章
Web服务开发的相关教程(不断更新中…)
查看>>
《道德经》全文
查看>>
XCODE4.3.2编程-HelloWorld
查看>>
always on 完整方案
查看>>
python 网络编程
查看>>
Entity Framework快速入门笔记第四篇—ModelFirst
查看>>
自定义的命民空间在其他程序集里无法调用
查看>>
[poj 2773] Happy 2006 解题报告 (二分答案+容斥原理)
查看>>
Datatable 插入一行数据到第一行
查看>>
vue中axios设置
查看>>
1149 Dangerous Goods Packaging
查看>>
centos网卡配置
查看>>
sigma网格中水平压力梯度误差及其修正
查看>>
基于netty的长连接
查看>>
DKNightVersion的基本使用(夜间模式)
查看>>
Sencha Touch Guide
查看>>
HackerRank "Kundu and Tree" !!
查看>>
Div居中,Div里的内容居中
查看>>
神州通,我看行---K2用户交流会华南站
查看>>
C# winform 中 TabControl 动态显示 TabPage
查看>>