Articles of 叉子

为什么我必须为subprocess“wait()”?

尽pipelinux手册页的等待1解释得非常好,你需要wait()他们的subprocess没有变成僵尸,它不能说明为什么。 我计划了我的程序(这是我的第一个multithreading程序,所以原谅我的天真)围绕一个for(;;)永久循环,启动subprocess得到exec() ,并确保自行终止。 我不能使用wait(NULL)因为这使得并行计算不可能,因此我可能不得不添加一个存储子pid的进程表,并且必须使用waitpid – 不是直接的,但是经过一段时间后 – 这是一个问题,因为孩子的运行时间从几微秒到几分钟不等。 如果我太早使用waitpid ,我的父进程会被阻塞,当我使用它太晚时,我会被僵尸所淹没,不能再fork() ,这不仅对我的进程不利,而且会导致整体意外的问题系统。 我可能不得不编程一些使用一些最大数量的孩子的逻辑,并在达到这个数字时阻止父母 – 但这不应该是必要的,因为大多数孩子很快终止。 我能想到的另一个解决scheme(创build一个产生并发孩子的双层父进程,同时产生并wait孙子们)现在对我来说太复杂了。 也许我也可以find一个非阻塞函数来检查子代,只有在终止时才使用waitpid 。 不过问题是: 为什么Linux保持僵尸呢? 为什么我必须等待我的孩子? 这是为了加强对父进程的纪律吗? 在使用Linux的几十年中,我从来没有从僵尸进程中获得任何有用的东西,但是我并不完全了解僵尸作为“function”的用处。 如果答案是,父进程需要有一种方法来查明他们的孩子发生了什么事情,那么看在上帝的份上,没有理由把僵尸算作正常的进程,并且禁止创build非僵尸进程,只是因为有太多僵尸。 在我目前正在开发的系统上,我只能产生400到500个进程,然后才能停下来(这是一个维护得不好的CentOS系统,运行在我能find的最便宜的VServer上 – 但仍然有400个僵尸不到几KB的信息)

fork()中的copy-on-write工作如何?

我想知道在fork()中如何写入copy。 假设我们有一个具有dynamicint数组的进程A: int *array = malloc(1000000*sizeof(int)); 数组中的元素被初始化为一些有意义的值。 然后,我们使用fork()来创build一个subprocess,即B. B将迭代数组并进行一些计算: for(a in array){ a = a+1; } 我知道B不会立即复制整个数组,但是什么时候子B为数组分配内存? 在fork()? 它是一次分配整个数组,还是只分配一个整数a = a+1 ? a = a+1; 这是怎么发生的? B是否从A读取数据并将新数据写入自己的数组? 我写了一些代码来探索COW如何工作。 我的环境:Ubuntu 14.04,gcc4.8.2 #include <stdlib.h> #include <stdio.h> #include <sys/sysinfo.h> void printMemStat(){ struct sysinfo si; sysinfo(&si); printf("===\n"); printf("Total: %llu\n", si.totalram); printf("Free: %llu\n", si.freeram); } int main(){ long len = […]

什么是叉返回?

成功时,subprocess的PID将在父进程的执行线程中返回,并在subprocess的线程中返回0。 p = fork(); 我在手册页混淆了,是等于0还是PID ?

fork()如何返回subprocess

我知道fork()对于subprocess和父进程的返回是不同的,但我无法find有关这种情况的信息。 subprocess如何从fork中得到返回值0? 有关调用堆栈的区别是什么? 据我所知,对于父母来说,是这样的: 父进程 – 调用fork – > system_call – 调用fork – > fork执行 – 返回到 – > system_call – 返回到父进程。 在孩子的过程中会发生什么?

为什么这个fork()输出产生8而不是5?

所以我必须find这个使用fork()方法的代码的输出。 我以为输出是5“你好”,但我得到了8。为什么呢? 这是代码: #include "csapp.h" void doit() { Fork(); Fork(); printf("hello\n"); return; } int main() { doit(); printf("hello\n"); exit(0); }

linux fork:防止文件描述符inheritance

你如何防止一个文件描述符在fork()系统调用中复制inheritance(当然,不closures它)? 我正在寻找一种方法来标记单个文件描述符 不被 fork()中的子项inheritance (copy-),类似于FD_CLOEXEC类似的黑客,但对于叉(如果你喜欢FD_DONTINHERITfunction)。 有人这样做? 或者看看这个,并有一个提示我开始? 谢谢 更新: 我可以使用libc的__register_atfork __register_atfork(NULL, NULL, fdcleaner, NULL) 在fork()返回之前closureschild中的fds。 但是,这些文件仍然被复制,所以这听起来像是一个愚蠢的黑客。 问题是如何跳过不需要的fds的子节点 我正在考虑一些场景,当需要fcntl(fd,F_SETFL,F_DONTINHERIT)时: fork()将复制事件fd(例如epoll); 有时这是不需要的,例如FreeBSD将kqueue()事件标记为KQUEUE_TYPE,这些types的fds不会跨叉复制(kqueue fds被显式地从复制中跳过,如果想要的话使用它从一个孩子,它必须与共享fd表分叉) fork()会复制10万个不需要的fds来为一些cpu密集型任务派生一个子对象(假设需要一个fork()的概率非常低,程序员不想维护一个子池,没有发生) 我们想要复制一些描述符(0,1,2),其中一些(大部分?)不是。 我认为全面的垃圾回收是出于历史原因,但我可能是错的。 这听起来有多愚蠢: patch fcntl来支持文件描述符上的dontinherit标志(不知道该标志是应该保持per-fd还是在fdtable fd_set中,就像exec-on-exec标志一样 修改内核中的dup_fd()以跳过dontinherit fds的拷贝,与freebsd一样,为kq fds 考虑该计划 #include <stdio.h> #include <unistd.h> #include <err.h> #include <stdlib.h> #include <fcntl.h> #include <time.h> static int fds[NUMFDS]; clock_t t1; static void cleanup(int i) { while(i– […]

在Ruby中用双叉创build一个守护进程

在Ruby中创build一个运行良好的Unix或Linux守护进程的正确方法是什么? 无论如何,一个行为良好的守护进程的定义是什么?如何在Ruby中编写这样的程序?

叉 – 相同的内存地址?

这是关于在Linux中的C. 我在main()中有fork() ,我创build了2个subprocess。 然后,在两个subprocess中运行函数abc() ,其中有一个局部variablesx 。 我写了一些价值。 然后我用printf("%p",&x)打印这个variables的地址。 两个进程都打印相同的地址。 我以为每个孩子都会得到父母记忆的(独立的)副本。 我需要每个进程都有自己的variablesx 。 我该怎么做,或者我做错了什么?

使用Process.spawn作为Process.fork的替代品

我的开发环境是运行ruby 1.9.3p125(RubyInstaller)和rails 3.2.8的Windows机器。 在使用第三方gem时,一次又一次出现的问题是缺lessWindows上的fork()。 这最近阻碍了我使用几乎任何运行gem的分布式testing(就像这些 ),因为它们依赖于fork。 一些StackOverflow的老问题试图find解决这个问题的方法,但是在将Process.spawn添加到ruby之前,或者是由于其他原因而被迫使用旧版本的Ruby的人。 提议的解决scheme之一是使用Cygwin获得fork()支持,这是完全没有问题的 – 我想我宁愿在这之前完全切换到Linux。 另一个build议的解决scheme是使用win32-process gem来获得fork()支持。 从最新的版本(0.7.0)中删除叉支持,并使用下一个最早的版本(0.6.6),它支持(叉)支持叉似乎没有工作,至less运行任何分布式testing我尝试过的gem(Spork,并行testing,Hydra,Specjour,几乎所有的)。 有趣的是,gem的作者在自述中提到Process.spawn是Process.fork的一个可以接受的解决方法。 我已经看到很多信息,或者暗示,或者直接声明 ,在Windows上,使用Ruby 1.9,派生可以用作fork的替代品。 我已经花了相当多的时间玩这个,基本上试图用几个引用的gem中的Process.spawn代替Process.fork,但没有成功。 在我看来,也许行为是相似的,但不完全一样。 例如,不清楚spawn实际上是以fork的相同方式复制整个过程,还是仅仅使用提供的参数创build一个新的过程。 也不清楚spawn方法是否接受另一个ruby方法作为参数,或者只接受一个系统命令。 文件似乎意味着它只是一个命令,但似乎是一种方法(sorting),但我可能做错了事情。 我认为对于某些事情来说,fork只是用来创build一个“便宜的线程”,在以前的ruby版本中不支持线程。 然而,似乎这些分布式testing的gem可能合法地依赖于fork()的全部function,以保持项目状态,并且不会为每个testing加载整个ruby环境。 这是在我的正常编程职责和经验之外,所以我可能会做出一些不正确的假设。 所以,我的问题是,在所有情况下,Process.spawn是否可以相对简单地使用以达到与Process.fork相同的结果? 我开始怀疑不是,但是如果是这样的话,有人可以举一个例子说明如何去做这个转变吗?

为什么我的编译器不接受fork(),尽pipe包含了<unistd.h>?

这是我的代码(创build只是为了testingfork()): #include <stdio.h> #include <ctype.h> #include <limits.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int main() { int pid; pid=fork(); if (pid==0) { printf("I am the child\n"); printf("my pid=%d\n", getpid()); } return 0; } 我收到以下警告: warning: implicit declaration of function 'fork' undefined reference to 'fork' 它有什么问题?