离职了,交接期也有足够的时间了,可以在好好的再看一下APUE,想想上次详细的看还是在两年之前,虽然中间也偶尔会翻出来看看,但是由于工作上交集相对比较少一直没有去细读一下。现在正好是一段空挡期可以好好看下书了。

第八章之前是一些基础性的东西,如果需要的话可以在后面的文字中稍微提一下,主要还是从进程开始吧。进程的出现是必然的,看下计算机发展的过程可以发现,随着硬件性能的不断提升,我们也在不断改变软件的性能,这样两者的结合才能做到完美。单进程的模式在现在看来是无法想象的,多个软件不能并行的运行,只能一个一个的串行的运行,也就是说我在用一个看视频的时候没法使用浏览器进行上网。要是把现在的人拉到当时去感受一下单进程的话估计会疯掉。多进程的出现很完美的解决了这些问题。

1.资源对多个进程是可用的。

2.物理处理器可以在多个进程在切换以保证每个程序都在运行中。

3.处理器和IO得到充分的利用。

Linus Torvalds写的Linux最初版本,只是打印AAA和BBB,让多个task同时工作充分理由计算机的硬件。最初的源码是汇编的我们也没必要去考证。现在的话我们还是来看看现在的Linux中关于一些多进程的模型以及IPC的方法吧。

1.Linux进程创建之fork, pid_t fork(void)

从函数名字来看是一个很简单的名字那么执行这个函数之后做了写什么呢?首先子进程得到一个父进程的副本,这里的副本包括数据空间,堆和栈的副本,正文段的副本。fork之后子进程不是从main函数开始执行,而是从何父进程相同的位置执行(得到的父进程的副本里有一个指针指向当前执行的代码段),由于子进程没有执行fork,所以fork函数在克隆子进程,把子进程中返回的进程ID初始化成0。之后他们就是两个独立的进程了。

不管是进程还是面向对象中的设计模式,你细细的看的话他的处理过程都来自于生活,感觉所有的过程都是在模拟和抽象一个人类具体生活过程,父进程子进程,父类子类,以及各种设计模式,在这里你多少都能看看到人的痕迹。有时候分析一个复杂的软件设计的时候我们可以从人是怎么处理类似的过程出发,然后抽象设计出这样的代码。

继续回到进程相关的东西上,下面是一个简单的samplecode从这里的输出你可以看到父子进程的栈空间上的数据是相互独立的。

        int var = ;
pid_t pid = ; if ((pid=fork()) < ){
printf("fork error");
}
else if (pid > ){ //parent process
var += ;
sleep();
printf("value in parent process:%d\n", var);
}
else {
var -= ;
printf("value in child process:%d\n", var);
}
return ;

相应的输出为:

2.父子进程之间的关系

2.1 父进程先于子进程结束

父进程的资源被释放,当前子进程的父进程设置init进程,这时的子进程也叫做孤儿进程(孤儿进程对系统是没有危害的)。下面是要给sample code。

        pid_t pid = ;

        if ((pid=fork()) < ){
printf("fork error");
}
else if (pid > ){ //parent process
sleep(); //child process execute first
}
else {
printf("befor parent exit ppid = %d\n", getppid());
sleep();
printf("after parent exit ppid = %d\n", getppid());
}
return ;

相应的输出为:

2.2 子进程先于父进程结束

子进程的资源被释放,但占用一个管理节点(用于父进程使用wait函数回收)。子进程给父进程发送SIGCHILD信号,如果父进程没有使用wait函数进行善后处理,那么这个进程就成了僵尸进程,他就永远的占用了系统的一些资源。下面是一个简单的sample code。使用ps可以查看到没有被回收的子进程的状态是Z(zombie)。

        pid_t pid = ;

        if ((pid=fork()) < ){
printf("fork error");
}
else if (pid > ){ //parent process
sleep();
}
else {
printf("pid = %d\n", getpid());
}
return

相应的输出为:

相应的如果使用wait函数了会是一个怎样的处理呢?

如果一个进程已经终止,并且是一个僵尸进程,则wait立即返回并取得该进程的状态。否则wait使调用者阻塞直到一个子进程终止。如果有多个子进程的话可以考虑waitpid(pid_t pid, int *status, int option)。

APUE学习之---------------进程的更多相关文章

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

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

  2. APUE学习心得

    APUE学习心得 Chapter 3 IO 3.2 文件描述符 文件描述符是一个非负整数.当打开 一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符.0 标准输入,1 标准输出, 2 标准错 ...

  3. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  4. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  5. VC++学习之进程和线程的区别

    VC++学习之进程和线程的区别 一.进程        进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格.内存空间.磁盘 ...

  6. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  7. Linux学习之进程管理(十九)

    Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps ...

  8. LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程

    LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

  9. LINUX内核分析第六周学习总结——进程的描述与创建

    LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...

随机推荐

  1. iOS手机号正则表达式并实现344格式 (正则的另一种实现方式)

    [Demo下载地址]https://git.oschina.net/remainedmute/PhoneNumDemo.git 相关博客http://www.jianshu.com/p/00da4d8 ...

  2. Dijkstra算法求单源最短路径

    Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...

  3. socket(套接字)

    客户端: 创建套接字(socket) 连接服务器(connect) 通信(send,recv或者write,read) 关闭套接字(closesocket) 示例代码: int main(int ar ...

  4. HDU 5573 Binary Tree(找规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5573 题意:给你一个完全二叉树,节点为自然数的排列(第一行1,第二行2 3,第三行4 5 6 7... ...

  5. IE7.JS解决IE兼容性问题方法

    转自:http://code.google.com/p/ie7-js/ 使IE5,IE6兼容到IE7模式(推荐) <!--[if lt IE 7]> <script src=&quo ...

  6. codeforces 292E. Copying Data 线段树

    题目链接 给两个长度为n的数组, 两种操作. 第一种, 给出x, y, k, 将a[x, x+k-1]这一段复制到b[y, y+k-1]. 第二种, 给出x, 输出b[x]的值. 线段树区间更新单点查 ...

  7. bzoj 1085: [SCOI2005]骑士精神 IDA*

    题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...

  8. codeforces 589F. Gourmet and Banquet 二分+网络流

    题目链接 给你n种菜, 每一种可以开始吃的时间不一样, 结束的时间也不一样. 求每种菜吃的时间都相同的最大的时间.时间的范围是0-10000. 看到这个题明显可以想到网络流, 但是时间的范围明显不允许 ...

  9. C#进程管理程序实现

    运行效果图 部分代码如下: #region 打开应用程序按钮事件处理程序 /// <summary> /// 打开应用程序按钮事件处理程序 /// </summary> /// ...

  10. 各种排序算法(C语言)

    #include <stdlib.h> #include <stdio.h> void DataSwap(int* data1, int* data2) { int temp ...