som*_*ody 6 unix linux perl posix fork
我读过关于fork的内容,根据我的理解,该过程是克隆的但是哪个过程?脚本本身或启动脚本的进程?
例如:
我正在我的机器上运行rTorrent,当一个torrent完成时,我有一个脚本运行它.此脚本从Web获取数据,因此需要几秒钟才能完成.在此期间,我的rtorrent进程被冻结.所以我使用以下内容编写了脚本fork
my $pid = fork();
if ($pid == 0) { blah blah blah; exit 0; }
Run Code Online (Sandbox Code Playgroud)
如果我从CLI运行这个脚本,它会在一秒钟内回到shell,而它在后台运行,正如我想要的那样.但是,当我从rTorrent运行时,它似乎比以前更慢.究竟是什么分叉了?rtorrent进程是否克隆了自己并且我的脚本在那里运行,或者我的脚本是否克隆了自己?我希望这是有道理的.
该fork()
函数返回TWICE!一旦进入父进程,就进入子进程一次.一般来说,这两个进程在各方面都是IDENTICAL,就像每个进程刚刚返回一样fork()
.唯一的区别是,在一个,则返回值从fork()
是0
,而在另一方面,它是非零的(子进程的PID).
因此无论运行Perl脚本的进程是什么(如果它是rTorrent中的嵌入式Perl解释器,那么rTorrent将是进程)将在fork()
发生的那一点上重复.
要回答名义问题,因为您评论说接受的答案未能做到这一点,所以fork
会影响调用它的过程。在 rTorrent 生成一个 Perl 进程然后调用 的示例中fork
,它是重复的 Perl 进程,因为它是调用 的 Perl 进程fork
。
一般情况下,一个进程无法访问除fork
自身之外的任何进程。如果可以告诉另一个任意进程自行运行fork
,那将带来无穷无尽的安全和性能问题。