从一道面试题谈Linux下fork的运行机制
某外企面试linux开发职位面试题:
给出如下C程序,在linux下使用gcc编译:
#include "stdio.h"
#include "sys/types.h"
#include "unistd.h"
int main(void)
{
pid_t pid1;
pid_t pid2;
pid1 = fork();
pid2 = fork();
printf("pid1:%d, pid2:%d\n", pid1, pid2);
}
要求如下:
已知从这个程序执行到这个程序的所有进程结束这个时间段内,没有其它新进程执行。
1、请说出执行这个程序后,将一共运行几个进程。
2、如果其中一个进程的输出结果是“pid1:1001, pid2:1002”,写出其他进程的输出结果(不考虑进程执行顺序)。
明显这道题的目的是考察linux下fork的执行机制。下面我们通过分析这个题目,谈谈linux下fork的运行机制。
预备知识
这里先列出一些必要的预备知识,对linux下进程机制比较熟悉的朋友可以略过。
1、进程可以看做程序的一次执行过程。在linux下,每个进程有唯一的PID标识进程。PID是一个从1到32768的正整数,其中1一般是特殊进程init,其它进程从2开始依次编号。当用完32768后,从2重新开始。
2、linux中有一个叫进程表的结构用来存储当前正在运行的进程。可以使用“ps aux”命令查看所有正在运行的进程。
3、进程在linux中呈树状结构,init为根节点,其它进程均有父进程,某进程的父进程就是启动这个进程的进程,这个进程叫做父进程的子进程。
4、fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
解题的关键
有了上面的预备知识,我们再来看看解题的关键。我认为,解题的关键就是要认识到fork将程序切成两段。看下图:
上图表示一个含有fork的程序,而fork语句可以看成将程序切为A、B两个部分。然后整个程序会如下运行:
step1、设由shell直接执行程序,生成了进程P。P执行完Part. A的所有代码。
&
相关文档:
Linux相比于Windows一个比较好的地方在于Linux提供了非常丰富的在线文档,更重要的是这些都是free的(下面的说明是针对debian发行版,其他的发行版情况可能会有所不同)。
Linux的在线文档大概可以分为以下几类:
(1)Man格式的手册,默认存放于/usr/share/man目录,用man命令查看。
(2)Info 格式的手册,默认存放 ......
文章来源:http://www.ibm.com/developerworks/cn/linux/l-memmod/index.html
级别: 初级
Vikram Shukla (vikshukl@in.ibm.com), 软件工程师, IBM
2006 年 2 月 23 日
在这篇 Linux® 内存模型指南中,我们将学习如何构建和管理内存方面的基础知识。本指南介绍了内存控制单元、分页模型方面的内容,并详细介绍了物理 ......
CPU : ARM9 s3c2410
LCD : 规格不明(这个很无奈,但是我所知道的只有一个分辨率)
源码修改:
/linux-2.6.30.4/arch/arm/mach-s3c2410/mach-smdk2410.c
在这个文件中加入framebuffer的初始化数据结构(具体数据参照LCD技术手册)如下:
#include <mach/fb.h> ......
转载自:http://howieshen.blogbus.com/logs/33958295.html
启动服务器时发现停在 starting sendmail 和 starting
sm-client,等了好久才可以进去,开始以为是主机设置的问题,查看了一下发现我设置错误
服务器:
/etc/hosts:
192.168.1.119 server
192.168.1.123 ......