加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 服务器 > 系统 > 正文

一次 Fork 引起的惨案!

发布时间:2021-11-23 15:17:40 所属栏目:系统 来源:互联网
导读:你还有什么要说的吗?没有的话我就要动手了,kill程序最后问道。 这一次,我没有再回答。 只见kill老哥手起刀落,我短暂的一生就这样结束了 我是一个网络程序,一直以来都运行在Windows系统上,日子过得很舒服。可前段时间,程序员告诉我要把我移植到Linux系
“你还有什么要说的吗?没有的话我就要动手了”,kill程序最后问道。
 
这一次,我没有再回答。
 
只见kill老哥手起刀落,我短暂的一生就这样结束了···
 
我是一个网络程序,一直以来都运行在Windows系统上,日子过得很舒服。可前段时间,程序员告诉我要把我移植到Linux系统下运行,需要对我大动手术,我平静的生活就这样被打破了。
 
来到这个叫Linux的地方运行,一切对我都很陌生,没有了熟悉的C盘、D盘和E盘,取而代之的是各种各样的目录。
 
/bin
/boot
/etc
/dev
/mnt
/opt
/proc
/home
/usr
/usr64
/var
/sys
...
这里很有意思,一切都是文件,硬件设备是文件、管道是文件、网络套接字也是文件,搞得我很不适应。
 
这些都还好,我都还能接受,但直到今天···
 
奇怪的fork
今天早上,我收到了一个网络请求,需要完成一个功能,这个工作比较耗时,我准备创建一个子进程,让我的小弟去完成。
 
这是我第一次在Linux系统上创建进程,有点摸不着北,看了半天,只看到程序员在我的代码里写了一个fork函数:
 
pid_t pid=fork();
if ( pid > 0 ) {
    ···
} else if( pid == 0 ) {
    ···
} else {
    ···
}
我晃晃悠悠的来到fork函数的门前,四处观察。
 
“您是要创建进程吗?”,fork函数好像看出了我的来意。
 
“是的,我是第一次在这里创建进程,以前我在Windows那片儿的时候,都是调用CreateProcess,但这里好像没有叫这个名字的函数···”
 
fork函数听后笑了起来,说道:“别找了,我就是负责创建进程的函数”
 
“你?fork不是叉子的意思吗,好端端的干嘛取这么个名字?”,我一边说,一边朝fork函数走去。
 
fork没有理会我的问题,只是说道:“您这边稍坐一下,我要跟内核通信一下,让内核创建一个子进程”
 
这下我倒是明白他的意思,像创建进程这种操作,都是由操作系统内核中的系统调用来完成的,而像fork这些我们可以直接调用的函数只是应用层的接口而已,这跟以前在Windows上是一样的。
 
不过我突然反应过来,着急问道:“唉,我还没告诉你要创建的进程参数呢,你怎么知道要启动哪个程序?”
 
fork扑哧一下笑出了声,不过并没有回答我的问题。
 
人生地不熟的,我也没好再多问,只好耐心等待,等待期间我竟然睡着了。
 
 
 
“醒醒”,不知过了多久,fork函数叫醒了我:“创建完成了,请拿好,这是进程号pid”,说完给了我一个数字。
 
我摊开一看,居然写了一个大大的0!
 
“怎么搞的,创建失败了?”,我问到。
 
“没有啊,您就是刚刚创建的子进程”
 
“啥?你是不是搞错了,我就是专程来创建子进程的,我自己怎么会是子进程?”
 
fork函数又笑了,“我没有搞错,您其实已经不是原来的你了,而是一个复制品,是内核刚刚复制出来的”
 
“复制品?什么意思?”,我越听越懵!
 
“每个进程在内核中都是一个task_struct结构,刚才您睡着期间,内核在创建进程的时候,把内核中原来的你的task_struct复制了一份,还创建了一个全新的进程地址空间和堆栈,现在的你和原来的你除了极少数地方不一样,基本上差不多”
 
 
 
“那原来的我呢?去哪里了”
 
“他已经变成你的父进程了,我是一个特殊的函数,一次调用会返回两次,在父进程和子进程中都会返回。在原来的进程中,我把你的进程号给了他,而我返回给你0,就表示你现在就是子进程”
 
原来是这样,我大受震撼,这简直颠覆我的认知,居然还有如此奇特的函数,调用一次,就变成了两个进程,思考之间,我忽然有些明白这个函数为什么要叫fork的原因了。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读