Articles of 分叉

Linux fork / exec到同一个目录下的应用程序

是否有一个exec变体,将使用当前的应用程序目录来定位目标程序? 我正在使用C ++和Qt来实现“最后的沟渠”错误报告系统。 使用Google Breakpad ,我可以创build一个小型转储并直接执行到一个处理程序。 因为我的应用程序处于不稳定状态,所以我只想使用最小的依赖关系来分叉并启动一个单独的error handling过程。 错误报告应用程序将被部署在与应用程序可执行文件相同的目录中。 我很不熟悉fork和exec选项,并且没有find包含searchpath中当前应用程序目录的exec选项。 这是我到目前为止: static bool dumpCallback(const char* /*dump_path*/, const char* /*minidump_id*/, void* /*context*/, bool succeeded) { pid_t pid = fork(); if (pid == 0) { // This is what I would *like* to work. const char* error_reporter_path = "error_reporter"; // This works, but requires hard-coding the entire […]

了解Python分叉和内存分配错误

我有一个内存密集型的Python应用程序(在几百MB到几GB之间)。 我有几个非常小的Linux可执行文件,主应用程序需要运行,例如 child = Popen("make html", cwd = r'../../docs', stdout = PIPE, shell = True) child.wait() 当我使用subprocess.Popen运行这些外部实用程序(一次,在长的主进程运行结束时)我有时会得到OSError: [Errno 12] Cannot allocate memory 。 我不明白为什么…请求的过程是微小的! 系统有足够的内存来存放更多的shell。 我使用Linux(Ubuntu 12.10,64位),所以我想subprocess调用Fork。 叉叉我现有的过程,从而加倍消耗的内存量,并失败?? 发生了什么“抄写”? 我可以在没有分叉的情况下产生一个新的进程(或者至less没有复制内存 – 从新开始)? 有关: fork(),vfork(),exec()和clone() fork()和内存分配行为 python subprocess.Popen错误与OSError:[Errno 12]一段时间后不能分配内存 Python的内存分配错误使用subprocess.Popen

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可以为我做吗?

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

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

分叉的subprocess使用相同的信号量吗?

比方说,我创build一个信号量。 如果我分叉一堆subprocess,他们都会使用同一个信号量吗? 另外,假设我在里面创build了一个带有信号量的分叉结构。 所有的subprocess仍然使用相同的信号量吗? 如果没有,将存储结构+信号量共享内存允许subprocess使用相同的信号量? 我真的很困惑如何我的分叉subprocess可以使用相同的信号量。