Articles of fork

fork()和scanf()如何一起工作?

我试图看看,如果我从键盘读取的东西,而我有多个进程与fork()(在我的情况下,有两个孩子和父母),我发现了以下问题会发生什么:我需要告诉父母等待孩子的进程,否则程序performance奇怪。 我做了一个研究,发现问题出在父母身上,他需要等待孩子的过程结束,因为如果父母的过程首先结束,那么他会closuresSTDIN,对吗? 但是我也发现每个进程都有一个STDIN的副本,所以我的问题是: 为什么它这样工作,为什么只有父母有STDIN和孩子没有问题,我的意思是为什么如果孩子的过程首先结束不影响STDIN,但如果父母的过程首先结束,它会影响STDIN? 这是我的testing: 我没有等待()运行程序,并input一个数字后,程序停止,但后来我再次input两次,另外两个来自printf()的消息出现。 当我用wait()运行程序时,一切正常,每个进程分别调用scanf()并读取一个不同的数字。

重载fork()

我重载了fork()系统调用,并使用RTLD_NEXT创build了我自己的fork()版本。 也就是dlsym(RTLD_NEXT, fork) 。 这将打我的版本的叉子。 在这之后,我想复制实际fork()系统调用的任务,即创buildsubprocess并返回pid,以及一些更多的附加function。 我无法弄清楚如何做到这一点。 我检查了fork() (fork.c)的内核源代码,并没有弄清楚。 这样做: dlsym(RTLD_NEXT,fork); int fork(void) { int pid=_fork(); // Trying to call actual fork does not work return pid; } 我怎样才能做到这一点? 这里是fork的内核源代码链接: http : //lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10 编辑(从评论拉入) : 我正在使用泄漏检测工具,并且此子工具在subprocess删除由父级分配的内存时检测到双重空闲。 为了克服这个,我将重写fork() ,并且每当有一个fork() ,父级的内存分配表将被复制到子级。

fork:重试:资源暂时不可用

我尝试在我的计算机上安装英特尔MPI基准testing,并收到错误消息: fork: retry: Resource temporarily unavailable 然后,当我运行ls和top命令时,再次收到此错误。 什么是造成这个错误? configuration我的机器: Dell precision T7500 Scientific Linux release 6.2 (Carbon)

为什么fork程序printf执行更多的时间

从fork的man页面读取fork创build父进程的重复。 但是不明白为什么在程序printf执行8次。 我也读linux的链接工作的fork() 。 #include <stdio.h> int main() { fork(); fork(); fork(); printf("process\n"); }

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

进程fork是subprocess,并在subprocess中调用exec() 。 随着写入时拷贝, fork之后父进程和subprocess共享内存。 当subprocess调用exec()来加载另一个进程时,Linux会将父内存复制到新内存中,并且subprocess还将另一个进程加载到这个新内存中? 如果是这样,这是否意味着在fork-exec时没有数据的写入时复制的过程呢?

学习pipe道,执行,分叉,并试图将三个进程链接在一起

我正在学习使用pipe道和pipe道上的这个代码。 该程序使用fork创build两个subprocess。 第一个孩子运行“ls”命令并输出到pipe1。 第二次从pipe1读取运行“wc”并输出到标准输出。 我只是试图在中间添加第三个进程,从pipe1读取,输出到pipe2。 基本上我正在尝试做什么 ls | cat | wc -l 我在做什么: (ls)stdout -> pipe1 -> stdin(cat)stdout-> stdin(wc -l) -> stdout 没有什么打印到标准输出,程序不会退出。 这是我的代码,其中包含进程#3的更改 int main(int argc, char *argv[]) { int pfd[2]; /* Pipe file descriptors */ int pfd2[2]; if (pipe(pfd) == -1) /* Create pipe */ perror("pipe"); if (pipe(pfd2) == -1) /* Create pipe […]

显示与fork分叉的进程数

我如何显示创build的进程数量? (不使用公式) for (i=0; i<3; i++) fork(); count = count + 1; printf("%d",count);

如何将后台运行的subprocess置于前台

如果我使用fork()和execv()来产生在后台运行的几个subprocess,我想把它们中的一个带到前台,我怎么能这样做呢? 我正在尝试编写一个可以在前台或后台启动进程的shell。

为什么我fork的进程将systemd作为父进程?

我在Linux中学习fork(),这里是我的程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 int main(void){ 5 int pid; 6 pid = fork(); 7 if(pid < 0){ 8 exit(1); 9 } 10 if(pid == 0){ 11 fork(); 12 fork(); 13 printf("pid:%d ppid:%d\n",getpid(),getppid()); 14 exit(0); 15 } 16 else{ 17 printf("parent pid:%d ppid:%d\n",getpid(),getppid()); 18 exit(0); 19 } 20 21 […]

在subprocess中更改iostreams

现在,我正在开发一个项目,在这个项目中,我需要启动一个subprocess来使用C ++在Linux中执行一个新程序,并且我需要将标准input和输出(如在C ++中,它们是cin和cout )redirect到一份文件。 这意味着在subprocess中,标准input和输出都是文件。 subprocess将从一个文件(其名称将是input.txt )读取input,并输出到一个文件(其名称将是output.txt )。 通过使用cin.rdbuf()和cout.rdbuf() ,我实际上可以在父进程中redirectcin和cout 。 但是当subprocess启动一个execl()命令时它不起作用。 看来,subprocess执行execl()命令后,标准input输出恢复正常。 任何人都可以帮我解决这个问题吗? 过去几天我一直困惑,找不到出路。 代码如下: //main.cpp #include<sys/types.h> #include<sys/time.h> #include<sys/wait.h> #include<sys/ptrace.h> #include<sys/syscall.h> #include<string> #include"executor.cpp" int main(int argc, char*argv[]) { executor ex; ex.set_path("/home/test"); ex.run_program(); } //executor.cpp #include<sys/types.h> #include<sys/time.h> #include<sys/wait.h> #include<sys/ptrace.h> #include<sys/syscall.h> #include<string.h> #include<unistd.h> #include<iostream> #include<fstream> using namespace std; class executor{ public: void run_program() { char p[50]; […]