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

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

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

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

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