分叉进程时会发生什么?

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进程是否克隆了自己并且我的脚本在那里运行,或者我的脚本是否克隆了自己?我希望这是有道理的.

Ada*_*kin 6

fork()函数返回TWICE!一旦进入父进程,就进入子进程一次.一般来说,这两个进程在各方面都是IDENTICAL,就像每个进程刚刚返回一样fork().唯一的区别是,在一个,则返回值从fork()0,而在另一方面,它是非零的(子进程的PID).

因此无论运行Perl脚本的进程是什么(如果它是rTorrent中的嵌入式Perl解释器,那么rTorrent将是进程)将在fork()发生的那一点上重复.

  • @jdizzle - 可能是因为这个问题没有多大意义,因为"某人"并不理解这个过程和分析想法.解释一些事实可能会有所帮助:) (2认同)

Dav*_*man 2

要回答名义问题,因为您评论说接受的答案未能做到这一点,所以fork会影响调用它的过程。在 rTorrent 生成一个 Perl 进程然后调用 的示例中fork,它是重复的 Perl 进程,因为它是调用 的 Perl 进程fork

一般情况下,一个进程无法访问除fork自身之外的任何进程。如果可以告诉另一个任意进程自行运行fork,那将带来无穷无尽的安全和性能问题。

  • 除了可以开很多玩笑之外:“嘿,你!快去叉吧!” “不,叉你!” (2认同)