Linux基础学习系列:对于fork()函数的学习,及进程创建相关知识

fork()函数

:由当前进程再生成一个进程出来


#include <sys/types.h>

#include <unistdh>


pid_t fork(void);

返回:子进程中为0,父进程中为子进程ID,出错为-1

        大于0表示运行在父进程当中,等于0表示运行再子进程当中

/**********************************************************************/

注:获取进程标识

#include <sys/types.h>

#include <unistd.h>

pid_t getpid(void);      //返回:调用进程的进程ID

pid_tgetppid(void);     //返回:调用进程的父进程ID

/**********************************************************************/

     由fork创建的新进程被称为子进程(child process)。


     该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是子进程的进程ID。 将子进程 I D 返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程 I D f o r k 使子进程得到返回值 0 的理由是:一个进程只会有一个父进程,所以子进程总是可以调用 g e t p p i d 以获得其父进程的进程 I D ( 进程 ID 0 总是由交换进程使用,所以一个子进程的进程 I D 不可能为 0 )


     一般来说,再fork()函数运行之后,是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。

     使用fork()函数得到的子进程从父进程处继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。

f o r k 有两种用法:

(1) 一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待委托者的服务请求。当这种请求到达时,父进程调用 f o r k ,使子进程处理此请求。父进程则继续等待下一个服务请求。

(2) 一个进程要执行一个不同的程序。这对 s h e l l 是常见的情况。在这种情况下,子进程在从 f o r k 返回   后立即调用 e x e c

父、子进程之间的区别:

1.fork()函数的返回值

2.进程ID

3.子进程的tms_utime, tms_stime, tms_cutime以及tms_ustime设置为0,即子进程的进程控制块(PCB)中时间相关参数设置为0

4.父进程设置的锁,子进程不继承

5.子进程的未决告警被清除

6.子进程的未决型号集设置为空集

例程:

 


运行结果:


The return value is 9479
In father process!
My PID is 9478
The return value is 0
In child process!
My PID is 9479

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

vfork()函数

     一般来说arm7和arm9的板子上运行的操作系统不太一样,arm7的是ucLinux,而arm9是Linux ,后者 有一个MMU


     vfork()函数就是对ucLinux来说的 。为什么要用vfork()函数呢,因为其对内存的申请做了一些优化 。首先其参数和返回值与fork()是一样的,只是两种的运行过程稍有不同,仅复制父进程的一些主要内容,并不是完全拷贝父进程的数据段和堆栈段,而使用写时复制技术(Copy—on—Write,COW),即仅修改时才做复制备份工作。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

exec()函数

     fork过来的子进程和父进程一模一样,是没有任何意义的,这时就要用到exec函数族(这里代表了一系列函数)。就是说fork()产生一个子进程,只是提供了一个运行空间,具体运行哪个程序,现在还没有定,最后由exec()以便去执行另外一个程序,有点类似于“金蝉脱壳”的感觉。之所以要安排两步建立进程,是为了在fork之后但在exex之前允许该子进程处理其文件描述符,这样可以完成对标准输入、标准输出和标准出错的重定向。


     当进程调用一种exec()函数时,该进程完全由新程序代替,而新程序则从其main()函数开始执行。因为调用exec()并不创建新进程,所以前后进程ID并未改变,exec只是用另一个程序替换了当前进程正文、程序、堆和栈段。

上述函数名中:l代表链表,v代表矢量(vector),e代表环境变量,p代表自动搜索相关系统路径(path)

转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——

**pang123hui的博客:

**

**CSDNhttp://blog.csdn.net/pang123hui/



原文地址:https://www.cnblogs.com/pang123hui/p/2309949.html