Articles of 分叉

fork()中的copy-on-write如何处理多个fork?

根据维基百科(这可能是错误的) 当发出fork()系统调用时,会创build与父进程对应的所有页面的副本,并由subprocess的OS将其加载到单独的内存位置。 但是这在某些情况下是不需要的。 考虑一下当一个孩子执行一个“exec”系统调用(用于执行C程序中的任何可执行文件)或在fork()之后很快退出的情况。 当需要subprocess来执行父进程的命令时,不需要复制父进程的页面,因为exec用要执行的命令replace调用它的进程的地址空间。 在这种情况下,使用了写入时复制(COW)技术。 使用这种技术,当发生分支时,父进程的页面不会被复制到subprocess。 相反,页面在subprocess和父进程之间共享。 每当一个进程(父或子)修改一个页面时,该特定页面的一个单独的副本就是针对执行修改的那个进程(父或子)进行的。 这个过程将使用新复制的页面,而不是在将来的所有引用中共享的页面。 另一个进程(没有修改共享页面的进程)继续使用页面的原始副本(现在不再共享)。 这种技术称为写时复制(copy-on-write),因为当某个进程写入时,页面被复制。 看来,当任何一个进程试图写入页面。 页面的新副本被分配并分配给产生页面错误的进程。 之后原始页面被标记为可写。 我的问题是:如果在任何进程尝试写入共享页之前多次调用fork,会发生什么?

如何find在Linux中分叉进程和写时复制之间共享多less内存?

如果有一个进程读取一个大文件并将其保存在内存中(或者只是一个混合的char *),并且该主进程是分叉的,如果subprocess只从该内存(或char *)读取,则根据写入时复制,保存指针的内存不被复制,并且父节点和子节点共享相同的内存,直到它们中的任何一个尝试写入该内存为止,在这种情况下该进程生成内存的副本并且改变那。 所以我的问题是,如果有一个复制执行写,是否有一种方法来知道孩子使用的内存,而不是与主进程共享的数量? 换句话说,如果一个subprocess实际使用了多less内存,如果它从一些读取调用中使用父内存? top或ps命令只会给出孩子应该拥有的总内存量。 (即假设内存或指针中的数据由孩子复制)。 有没有办法获得CoW语义实际使用的数据量? 我按照aix和Mat的build议,经过/proc/[pid]/smaps ,但是我发现所有的空白smaps文件都很多。 我试过这个命令来查找哪些文件中有数据: tail -n 5 */smaps | less tail -n 5 */smaps | less和我得到的O / P是 ==> 1012/smaps <== ==> 1074/smaps <== ==> 10/smaps <== ==> 1148/smaps <== ==> 11862/smaps <== ==> 11/smaps <== ==> 1355/smaps <== ==> 1356/smaps <== ==> 1357/smaps <== ==> 1358/smaps <== […]

线程和fork()。 我该如何处理?

可能重复: 分叉在multithreading程序中 如果我有一个使用fork()的应用程序,并且可能被开发为multithreading,那么安全编程这种应用程序需要考虑哪些大拇指规则/准则?

fork()和STDOUT / STDERR从subprocess到控制台

我正在写一个程序,分叉多个subprocess,我希望所有这些subprocess能够写入STDERR和STDOUT行,而不会输出乱码。 我没有做任何奇怪的事情,只是发出以新行结束的行(至less在我的理解中是Linux的primefaces操作)。 从perlfaq它说: 主进程和后台进程(“subprocess”)共​​享相同的STDIN,STDOUT和STDERR文件句柄。 如果同时尝试访问它们,可能会发生奇怪的事情。 您可能想要closures或重新打开这些孩子。 您可以通过打开pipe道来解决这个问题(请参阅open),但在某些系统上,这意味着subprocess无法与父进程相比。 它说我应该“closures或重新打开”这些孩子的文件句柄。 closures很简单,但是“重新打开”是什么意思? 我从我的subprocess中尝试过这样的东西,它不起作用(输出仍然是乱码): open(SAVED_STDERR, '>&', \*STDERR) or die "Could not create copy of STDERR: $!"; close(STDERR); # re-open STDERR open(STDERR, '>&SAVED_STDERR') or die "Could not re-open STDERR: $!"; 那么,我在做什么错呢? 它会暗示的pipe道示例是什么样的? 有没有更好的方法来协调来自多个进程的输出到控制台?

如何处理fork()后的execvp(…)错误?

我常做的事情是: 叉子() 儿童中的execvp(cmd,) 如果execvp由于没有findcmd而失败,我怎么能注意到父进程中的这个错误?

multithreading的叉子

fork()函数可用于复制multithreading进程。 如果是这样,所有的线程将完全相同,如果没有,为什么不。 如果复制不能通过fork完成,还有其他的function可以为我做吗?

在Windows中复制fork()的最佳方法是什么?

我如何实现一些逻辑,使我能够在Windows上使用Python在fork()系统调用时重现Linux上的function? 我特别试图在SAPI Com组件上执行一个方法,同时继续主线程中的其他逻辑而不会阻塞或等待。

我怎样才能从Windows上的Perl CGI脚本分叉后台进程?

在Windows上运行时,遇到了Perl CGI脚本的进程故障。 主要的问题似乎是,在Windows上运行时会模拟“fork”,而实际上并没有创build一个新的进程(只是当前的另一个线程)。 这意味着正在等待进程完成的Web服务器(如IIS)将继续等待,直到“后台”进程结束。 有没有在Windows下从CGI脚本中分离出后台进程的方法? 更好的是,我可以调用哪一个函数来实现跨平台的function? (只是为了让生活变得更加困难,我真的很喜欢将分叉进程输出redirect到一个文件的好方法)。

在Windows上用PHP分叉

我们在Windows服务器上运行PHP(确实存在很多问题的源代码,但是迁移目前不是一种select)。 有几点,用户发起的行动需要启动一些需要一段时间的事情,而用户不需要知道它们是成功还是失败,比如发送电子邮件或确保某些事情第三方帐户更新。 如果我可以用pcntl_fork()分叉,这将是非常简单的,但PCNTL函数在Windows中不可用。 看来我能得到的最接近的是做这种性质的事情: exec( 'php-cgi.exe somescript.php' ); 但是,这将会复杂得多。 我需要启动的动作依赖于运行过程中已经存在的很多环境; 使用上面的例子,我需要弄清楚基本数据,并以某种方式将其提供给新脚本。 如果我能够分叉,那么只需要让父进程尽早返回就可以了,让孩子在更多的事情上工作。 我发现有几个人在谈论他们自己的工作,获得Windows上编译的各种PCNTL函数,但似乎没有任何东西可用(断开链接等)。 尽pipe这个问题与我的名字实际上是一样的,但似乎问题是执行超时而不是分叉。 所以,我最好的select是重构一下处理调用php-cgi,还是有其他的select? 编辑:似乎exec()将不会为此工作,至less不是没有我认为它的一些其他方面,因为它等待,直到调用返回。 我想我可以使用START ,有点像exec( 'start php-cgi.exe somescript.php' ); ,但仍然等待另一个脚本完成。

什么是最好的方式来在Win上分叉/线程的PHP?

我有一个PHP脚本,检查(千)网站上的更新。 有时候(随着网站数量的增加,频率越来越高),我在其中一个站点的更新上遇到了执行超时,而整个脚本就会消失。 我能想到的最好的想法是分叉每个更新,所以如果它死了,整体更新只是继续。 从我看来,似乎PHP线程是不能依赖的,特别是在Windows平台(我不得不努力)。 我想过使用curl作为分叉机制,但是对于服务器(在时间和处理能力方面)是不是会花费更多的代价呢? 我很乐意听到关于PHP分叉/线程的一些想法和经验… 谢谢,奥默。