Articles of fork

如何告诉valgrind memcheck分叉进程?

我有一个stream程x ,我想检查与valgrind泄漏。 问题是x由y运行, y依次由z运行。 我不能运行x独立,因为y和z为x设置环境,例如环境variables,命令行开关, x所需的文件等。 有什么办法可以告诉valgrind在z上运行,但是要遵循它发现的任何分叉并且报告它们? 有什么办法可以告诉valgrind遵循任何分叉,但只报告名为x的进程? 有什么办法可以告诉valgrind附加到已经运行的进程,我可以用gdb做的方式吗? 我不知道这是否重要,但我正在SuSE64 linux和valgrind-2.4.0下运行。 谢谢!

如何将parameter passing给由fork()创build的进程

我想在C中使用fork()创build一个进程的副本。我不知道如何将parameter passing给我的进程副本。 例如,我想将一个整数传递给进程副本。 或者我该怎么做,如果我有一个循环,我打电话fork(),并希望传递一个唯一的值进程(例如0 … N) for(int i = 0;i < 4;++i) { fork(); // pass a unique value to new processes. }

fork-execpipe道redirect问题

有谁能告诉我这个代码有什么问题吗? 总之,它创buildinput和输出pipe道和fork–exec的sort程序。 父节点读取字典/usr/share/dict/words并将其写入到dup2() 'd的pipe道中,同样从中读取输出,并将其打印到terminal(标准父母的输出)。 或者至less,这就是应该发生的事情。 回溯表示父母挂在第130行的read() (标记为“XXX”注释)。 就好像sort没有意识到文件结束,但是closurespipeIn的写入结束应该“发出”这个信号,对吗? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char** argv) { int pipeIn[2]; int pipeOut[2]; if ((pipe(pipeIn)) == -1) { perror("pipe"); exit(EXIT_FAILURE); } if ((pipe(pipeOut)) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid_t child = fork(); if […]

从multithreading应用程序生成进程

我有一种情况,我需要从一个非常大的multithreading应用程序中产生一个辅助进程,但是我没有完全的控制权。 现在我正在使用fork() / exec() 。 这在很多情况下都是有效的,但是在某些情况下,在exec()发生之前,孩子会奇怪地崩溃。 我怀疑这是因为fork()multithreading应用程序通常被认为是一个真正的坏主意。 我真的很喜欢以primefaces方式启动一个进程的方式,没有fork()父进程:所有文件描述符closures,环境设置我想要的方式,CWD设置等。这应该避免所有的fork()我的multithreading父应用程序,并处理文件描述符inheritance,等posix_spawn()应该是理想的。 不幸的是,在Linux上, posix_spawn()使用fork()和exec() 。 vfork()被定义为挂起父进程,直到subprocess调用exec() 。 这似乎更像我想要的,但我的理解是, vfork()通常被认为是一个历史遗迹这些天,相当于fork() —这仍然是这种情况? 处理这个问题最糟糕的方式是什么? 注意: 我不能在任何线程启动之前产生我的进程(因为我不能在那个时候运行代码) 由于外部的要求,我不能重新devise我的应用程序不需要帮助程序 在产卵辅助过程之前,我不能暂停所有的线程,因为它们不属于我 这是在Linux上。 涉及Java,但我所有的代码都在C

在linux中用子节点recursion地杀死R进程

我正在寻找一个通用的方法来启动,然后杀死一个R进程,包括可能调用的所有分支或其他进程。 例如,用户像这样运行脚本: library(multicore); for(i in 1:3) parallel(foo <- "bar"); for(i in 1:3) system("sleep 300", wait=FALSE); for(i in 1:3) system("sleep 300&"); q("no") 用户退出R会话后,subprocess仍在运行: jeroen@jeroen-ubuntu:~$ ps -ef | grep R jeroen 4469 1 0 16:38 pts/1 00:00:00 /usr/lib/R/bin/exec/R jeroen 4470 1 0 16:38 pts/1 00:00:00 /usr/lib/R/bin/exec/R jeroen 4471 1 0 16:38 pts/1 00:00:00 /usr/lib/R/bin/exec/R jeroen 4502 4195 […]

在Linux上跨进程共享数据

在我的应用程序中,我有一个过程,把一个孩子分出来,说child1,这个subprocess在磁盘上写一个巨大的二进制文件并退出。 父进程然后分出另一个subprocesschild2,它读取这个巨大的文件做进一步处理。 文件转储和重新加载正在使我的应用程序变得缓慢,我正在考虑完全避免磁盘I / O的可能方法。 我已经确定的可能的方法是RAM磁盘或tmpfs。 我可以以某种方式在我的应用程序内部实现ram-disk或tmpfs吗? 或者还有什么其他方式可以完全避免磁盘I / O,并可靠地跨进程发送数据。

线程分叉时会发生什么?

我知道从一个线程调用fork() sys_call是一个坏主意。 但是,如果一个线程使用fork()创build一个新的进程会发生什么? 新进程将是创build线程的主线程的subprocess。 我认为。 如果其父节点首先完成,则新进程将被附加到init进程。 而它的父母是主线程,而不是创build它的线程。 纠正我,如果我错了。 #include <stdio.h> #include <pthread.h> int main () { thread_t pid; pthread_create(&(pid), NULL, &(f),NULL); pthread_join(tid, NULL); return 0; } void* f() { int i; i = fork(); if (i < 0) { // handle error } else if (i == 0) // son process { // Do something; […]

perl fork()exec(),subprocess狂放

我正在使用Linux和.sh是在tcsh 。 我做了一个非常基本的fork和exec ,但是我需要帮助来实现安全。 基本上我的Perl脚本在subprocess中调用.sh脚本。 但是当我Ctrl+c杀死父母时,信号被孩子忽略。 1)如何捕获subprocess的SIGINT ? 2)运行.sh脚本的subprocess仍然是标准输出到xterm的屏幕。 我怎样才能删除这个? 我正在考虑在后台运行脚本 exec("shell.sh args &"); 但还没有testing,因为我需要弄清楚如何防止孩子先疯狂。 3)父进程(perl脚本)不等待subprocess(.sh脚本)。 所以我读了很多关于孩子成为僵尸 ? 脚本完成后会发生吗? 我将如何阻止它? $pid = fork(); if($pid < 0){ print "Failed to fork process… Exiting"; exit(-1); } elsif ($pid ==0) { #child process exec("shell.sh args"); exit(1); } else { #execute rest of parent}

什么是可能导致fork()或system()调用在Linux上失败的一些条件?

怎么能找出它们是否发生,并导致由fork()或system()返回的错误? 换句话说,如果fork()或system()返回一个错误,我可以检查一下Linux中有哪些东西来诊断为什么会发生这个特定的错误? 例如: 只是内存不足(导致errno ENOMEM) – 检查内存使用“免费”等 内核没有足够的内存来复制父进程的页表和其他会计信息(导致errno EAGAIN) 是否有全球stream程限制? (导致errno EAGAIN呢?) 是否有每个用户的进程限制? 我怎么知道它是什么? …?

C静态variables和linux fork

嗨,我创build了一个服务器程序,它在接受套接字连接之后分叉一个新的进程。 在程序中定义了几个静态分配的全局variables。 我的问题是这些静态缓冲区后分配两次? 还是叉只重复堆和调用堆栈上的地址空间?