Articles of 分叉

如何在unix中使用fork()? 为什么不是fork的forms(pointerToFunctionToRun)?

我在理解如何使用Unix的fork()时遇到了一些麻烦。 我习惯于在需要并行化时在我的应用程序中产生线程。 这总是一些forms CreateNewThread(MyFunctionToRun()); void myFunctionToRun() { … } 现在,在了解Unix的fork() ,我给出了这个窗体的例子: fork(); printf("%d\n", 123); 其中fork后面的代码是“分割”的。 我无法理解fork()是如何有用的。 为什么fork()与上面的CreateNewThread()没有类似的语法,在那里你传递一个你想运行的函数的地址? 为了完成类似于CreateNewThread()的工作,我必须要有创意,并且要做类似的事情 //pseudo code id = fork(); if (id == 0) { //im the child FunctionToRun(); } else { //im the parent wait(); } 也许问题是,我习惯于以.NET的方式产生线程,我不能清楚地想到这一点。 我在这里错过了什么? fork()比CreateNewThread()什么优点? PS:我知道fork()会产生一个新的进程 ,而CreateNewThread()会产生一个新的线程 。 谢谢

叉的共享内存

我想在两个进程之间创build一个共享内存。 我用fork()。 一个孩子试图改变这个共享的记忆,母亲创造另一个孩子,所以新的孩子试图改变相同的记忆等等。 这里是我在C编程的代码。 (Ubuntu的) mylist ch=NUL; f=fork(); if(!f){ pba=shmget(KEYSHM,sizeof(char),0); /*created shared memory*/ ch=(mylist *) shmat(pba,0,0); ch->name=ugur; ch->surname=cedric; …do something… } else{ if(ch) printf("this is top of mylist %s"ch->name); …….do something } 它从不写ch->名字。 为什么? 我创build了一个共享内存。 为什么父进程无法读取?

如何创buildunix进程二叉树?

有人能帮我一把,不一定能完成我的功课。 我需要使用fork()创build一个进程树。 在Unix / C到目前为止最好的我可以到达第四级这里是我的代码: /* Includes */ #include <unistd.h> /* Symbolic Constants */ #include <stdio.h> /* Input/Output */ #include <stdlib.h> /* General Utilities */ int main() { pid_t childpid; pid_t pid; int i; childpid=fork(); waitpid(); i=0; for (; i<1; i++) { int b=0; for (; b<1;b++) { childpid=fork(); fprintf(stderr,"the value of i is %d, […]

原始克隆系统调用

我试图使用原始克隆系统,但我找不到任何适当的文档。 我试图编写一个小程序来尝试,但最终会出现分段错误。 我不明白我错在哪里。 这里是小应用程序: define STACK_SIZE 0x10000 define BUFSIZE 200 #define _GNU_SOURCE void hello (){ fprintf(stderr,"Hello word\n"); _exit(0); } int main() { int res; void *stack = mmap(0, STACK_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); pid_t ptid, tid; printf("Stack %p\n", stack + STACK_SIZE); memset(stack, 0, STACK_SIZE); res= syscall(SYS_clone,CLONE_SIGHAND|CLONE_FS|CLONE_VM|CLONE_FILES,stack + STACK_SIZE, &tid,&ptid,NULL ); if (!res) hello(); printf("Clone result […]

分叉和执行许多不同的过程,并从每一个获得结果

我设法从我的应用程序中分叉和执行一个不同的程序。 我目前正在研究如何等待从exec调用的进程通过pipe道或标准输出返回结果。 但是,我可以使用单个分支还是一组进程,还是必须多次分叉并再次调用相同的程序? 我可以为每个不同的过程获得PID吗? 我希望我的应用程序调用我目前多次调用的同一个程序,但使用不同的参数:我想要一组同一程序的8个进程运行,并通过pipe道返回结果。 请有人指点我正确的方向吗? 我已经浏览了linux.die手册页,但是它们在描述中相当简陋而且含糊不清。 有没有电子书或pdf我可以find详细信息? 谢谢! pid_t pID = fork(); if (pID == 0){ int proc = execl(BOLDAGENT,BOLDAGENT,"-u","2","-c","walkevo.xml",NULL); std::cout << strerror(errno) << std::endl; } 例如,我怎样才能通过PID控制哪个子(根据参数xml文件)得到了哪个结果(通过pipe或者stdout),并据此采取行动? 我是否必须将subprocess封装在一个对象中,并从那里开始工作,还是可以将它们完全分组?

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,那么安全编程这种应用程序需要考虑哪些大拇指规则/准则?