后台面试经典问题-fork exec函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hahachenchen789/article/details/83275879

Pid_t fork(void);

 

返回值:在子进程中返回0,在父进程中返回子进程id。出错返回-1。

原因在于:任何子进程只有一个父进程,且子进程总是可以通过调用getppid取得父进程的进程ID。

而相反,父进程可以有许多子进程,而且无法获取各个子进程的进程ID。

父进程中调用fork之前打开的所有描述符在fork返回之后由子进程分享。可以看到网络服务器利用了这个特性:父进程调用accept阻塞后调用fork,所接受的已连接套接字随后与子进程共享。通常情况下,子进程继续读写该套接字,而父进程关闭此套接字。

 

fork不带参数,所有资源都通过复制数据结构进行复制。子进程获得父进程数据空间,堆和栈的副本,注意这是副本也就是copy,与父进程无关(不共享)。子进程与父进程只共享正文段(代码段)。

 

 

一般而言,在fork之后是父进程先执行还是子进程先执行是不确定的。取决于内核的调度算法。

 

子进程继承父进程的如下特性:

1.打开的文件,或者是文件偏移量

2.实际用户ID,实际组ID,有效用户ID,有效组ID

3.附属组ID

4.进程组ID

5.会话ID

6.当前工作目录

7.信号屏蔽和安排

8.环境

9.存储映像

 

不继承(区别):

1.fork的返回值

2.进程ID

3.文件锁

…..

 

 

fork最主要的用法:

1.一个进程复制自己,使得能同时执行不同的代码段,这是网络服务器的经典用法-父进程等待客户端的服务请求(connect),当请求到达时,父进程调用fork让子进程处理此请求,父进程继续等待下一个客户端连接请求。

2.一个进程要执行另一个不同的程序,这对于shell是常见的情况。子进程fork返回后立即调用exec。某些操作系统还会将fork和exec组合成一个操作:spawn。

 

 

 

 

函数exec

使用fork创建新的子进程后,子进程调用exec函数来执行另一个程序。当程序调用exec函数时,该进程执行的程序完全替换成为新程序,而新程序从main函数开始执行。exec并不创建新进程,所以前后进程ID不变。

猜你喜欢

转载自blog.csdn.net/hahachenchen789/article/details/83275879
今日推荐