具体如下。
fork函数功能 fork函数实现原理
fork函数功能 fork函数实现原理
fork函数功能 fork函数实现原理
函数:fork()英文单词意思是叉子,分叉;那么在计算机中fork()就是分叉函数。
复刻(英语:fork,又译作派生、分支)是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进从一个软件包拷贝了一份源代码然后在其上进行的开发,创建不同的软件。这个术语不只意味着版本控制上的分支,同时也意味着开发者社区的分割,是一自由及开放源代码软件可以从原有开发团队复刻而不需要事先的许可,这也不会违反任何著作权法律。授权的专有软件(例如Unix)的复刻也时有发生。计算机(comr)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。可分为超级计算机、工业控制计算机、网络计算机、个人计算机、嵌入式计算机五类,较先进的计算机有生物计算机、光子计算机、量子计算机等。由硬件系统和软件系统所组成,没有安装任何软件的计算机称为机。
1、当次调用fork()时(i=fork()),原来的进程就变成了两个进程(父进程+子进程),然后产生的父进程、子进程再次调用fork()时(j=fork()),又分别产生两个进程,当然是4个咯。
2、i、j是调用fork()函数时,产生的子进程的pid值。getpid()得到当前进程的进程的id号,getppid是当前进程的父进程的id号。
请勿直接抄袭我的回答。
按道理,程序在运行时会分出其他的七个进程,一共八个进程。
也就是说how最多执行2次
are最多执行4次
you最多执行8次
每次不能保证都执行,
也不能确定执行的顺序。
因为八个进程是相互的。
运行下面的代码,即将会看得更清楚:
#include
#include
#include
int main( void )
{pid_t pid1=-1,pid2=-1,pid3=-1;
pid1=fork( );
{if(pid1<0) printf("error(how)n");
else if(pid1==0) printf("how(child)(%d%d%d)n",pid1,pid2,pid3);
else printf("how(parent)(%d%d%d)n",pid1,pid2,pid3);
}pid2=fork( );
{if(pid2<0) printf("error(are)n");
else if(pid2==0) printf("ara(child)(%d%d%d)n",pid1,pid2,pid3);
else printf("ara(parent)(%d%d%d)n",pid1,pid2,pid3);
}pid3=fork( );
{if(pid3<0) printf("error(you)n");
else if(pid3==0) printf("you(child)(%d%d%d)n",pid1,pid2,pid3);
else printf("you(parent)(%d%d%d)n",pid1,pid2,pid3);
}return 0;
}
fork函数 最难理解的是调用它一次,它却返回2次。它在调用进程(即父进程)中返回一次。返回值是新派生进程(子进程)的进程ID号;在子进程中又返回一次,返回值是0.
因此,返回值本身告知当前进程是子进程还是父进程。
fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
fork一般用于处理多线程任务。比如在网络中,你需要同时发送多种请求报文,则可以fork出子进程来进行发包任务,而父进程则直接去做自己的逻辑任务。
学习函数可以从功能入手,看它能够实现那些特定的需求。网络上给的只能是教科书似的定义,要是你想收获更多,建议看一些开源代码。
一、fork函数详解
函数原型:
#include
pid_t fork(void);
fork函数是对整个进程进行了,我们称新的进程是原进程的子进程,子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程ID和父进程ID不同
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集。
二、 exec() 函数详解
用一个新的程序来替换现在的整个进程,其会将程序整个加载到现在的进程中,然后从头开始运行。
三、二者区别
通过上面的描述我们可以知道fork和exec经常会放到一块去使用,来创建一个新的子进程,并且在这个子进程里去运行一个新的程序。fork用来创建子进程,处理的对象是进程;而exec()是用来处理程序,重新加载一个进程里的程序。有人问,问什么不能把这两个东西合成一个syscall呢? 例如windows下就有createprocess的指令。有以下几方面的原因:
1、接口的通用性
要知道二者不一定必须要合在一起使用的,存在这种情况,即当前进程的程序已经执行完成,我可以直接通过exec来加载新程序,并不需要fork出一个新的进程,fork因为是完全进程,是很浪费时间的。还有进程TCP端口的时候,我们需要生成子进程来处理一些特定需求,然后主进程继续,但是这个时候是不需要exec的。
2、效率
fork出一整个进程会占用很多空间(需要存贮进程的指令,数据,栈),将两个syscall 分开可以让我们在子进程执行制定程序前对其进行修改,会高效很多。
还有一点,如果create process的话,就要涉及从一个地址空间把所有数据拿出来然后修改,然后迁移,跨地址空间的修改会很费时;两个分别的是先,然后根据exec来做reload。
版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 836084111@qq.com 邮箱删除。