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() ,父级的内存分配表将被复制到子级。

Unix fork()系统调用什么时候运行?

void child(int pid){ printf("Child PID:%d\n",pid); exit(0); } void parent(int pid){ printf("Parent PID:%d\n",pid); exit(0); } void init(){ printf("Init\n");//runs before the fork } int main(){ init();//only runs for parent ie runs once printf("pre fork()");// but this runs for both ie runs twice //why??? int pid = fork(); if(pid == 0){ child(pid); //run child process }else{ parent(pid);//run parent […]

使用fork()在C(不是C ++)中创build3个孩子

嗨,我一直在制定一项计划,让孩子们分叉,然后再从每个孩子那里分娩更多的孩子,但这不是我需要帮助的。 当我运行我的程序(在这里它是一个function,但工作原理是一样的)我应该有一个父母(PPID)产卵3个孩子(PIDS = 1,2,3),但我得到的是相同的PID和PPID 3次(我现在的代码),或者在我得到3个父母之前,每个父母都有一个孩子,PPIDS与PIDS不同,但PPID与以前的孩子PID一样。 在我最近的尝试中,从不在父子(父亲)的信息上方显示孩子(儿子)。 它应该看起来像这样 [dad] hi am I PID 1234 and I come from ####(dont care what this number is) [son] hi i am PID 1111 and I come from PPID 1234 [son] hi i am PID 1112 and I come from PPID 1234 [son] hi i am PID 1113 and I […]

使用Python 3.6.1在Linux / Intel Xeon上使用“fork”上下文块进行多处理?

问题描述 我稍微调整了这个答案的代码(见下文)。 但是,当在Linux上运行这个脚本(如命令行: python script_name.py )时,它将打印所有jobs running: x ,但之后似乎卡住了。 但是,当我使用spawn方法( mp.set_start_method('spawn') )它工作得很好,立即开始打印countervariables的值(请参阅listener方法)。 题 为什么它只在产卵过程中起作用? 我怎样才能调整代码,所以它与Forc的工作(因为它可能更快) 码 import io import csv import multiprocessing as mp NEWLINE = '\n' def file_searcher(file_path): parsed_file = csv.DictReader(io.open(file_path, 'r', encoding='utf-8'), delimiter='\t') manager = mp.Manager() q = manager.Queue() pool = mp.Pool(mp.cpu_count()) # put listener to work first watcher = pool.apply_async(listener, (q,)) jobs […]

Linux:fork&execv,等待subprocess挂起

我写了一个辅助函数来启动一个使用fork()和execv()这个答案的过程 。 它用于启动例如mysqldump来进行数据库备份。 代码在不同程序的不同位置工作得很好。 现在我击中了一个失败的星座:这是一个呼叫systemctl来停止一个单位。 运行systemctl工作,单位停止。 但是在中间进程中,等待()进程的时候,wait()挂起,直到超时过程结束。 如果我检查,如果工作进程完成kill(),我可以告诉它。 重要提示:除了wait()不表示工作进程结束之外,程序不会出现错误或故障。 我的代码中有什么(见下文)是不正确的,可能会触发这种行为? 我已经读过Threads和fork():在混合它们之前三思,但是我找不到与我的问题有关的任何东西。 奇怪的是:程序中使用了深度,深度和深度的JSON-RPC。 如果我停用使用JSON-RPC的代码,一切正常!? 环境:使用该function的程序是一个multithreading应用程序。 所有线程的信号都被阻塞。 主线程通过sigtimedwait()处理信号。 代码(通过std :: cout输出日志logging的生产代码)和样本主函数: #include <iostream> #include <unistd.h> #include <sys/wait.h> namespace { bool checkStatus(const int status) { return( WIFEXITED(status) && ( WEXITSTATUS(status) == 0 ) ); } } bool startProcess(const char* const path, const char* const argv[], const unsigned int […]

如果我fork()然后做一个execv(),谁拥有控制台?

我正在编写一个Linux应用程序。 如果我调用fork() ,然后运行一个需要控制台input的应用程序,会发生什么? 考虑下面的代码: int process_id = fork(); if (process_id != 0) { /* this is the parent process */ error = execv("../my_other_app", "parameter1", NULL); if (error < 0) { printf("error!"); } } else { /* this is the child process. Wait for my_other_app to set up */ sleep(3); /* now continue */ } printf("########## […]

C ++,linux,fork,execvp,waitpid和SIGTSP

我正在实施一个家庭工作terminal。 我差不多完成了,我只需要实现一个bg(Background)和一个fg(Foreground)命令。 我的代码如下所示: void run(){ string command[] = parseMyInput( getInput() ); int fork_result = fork(); if( -1 == fork_result ) //handle error else if( 0 == fork_result ){ // child setpgrp(); // I don't want the children to get the signals if( -1 == execvp( command[0], makeArgs(command) ) ) //handle error } else { // […]

编写linux shell

我正在学习Unix C并为练习做一些练习。 我目前正在编写我自己的shell,其工作方式类似于linux bash shell。 我下面的代码提供了一个相当基本的shell。 它现在提供I / Oredirect。 我正在尝试添加对pipe道的支持。 最初,我只想添加对单个pipe道的支持。 我试图通过一些在线教程,但不能完全弄清楚从哪里开始。 目前,下面的shell可以处理下面的命令命令。 ls> abc,cat <file1> file2等 #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <string.h> #include <sys/wait.h> #include <fcntl.h> #define TRUE 1 int main(void) { char *arg_list[10]; int status; int counter = 0; int counter2 = 0; pid_t pid; char buf[100]; char inFile[10]; […]

为什么fork()在subprocess中返回0?

正如我们所知,fork()将返回两次,即两个PID。 subprocess的PID在父进程中返回,并在subprocess中返回0。 为什么0在subprocess中返回? 有什么特别的原因呢? 更新我被告知在父进程和subprocess之间使用链表,父进程知道subprocess的PID,但是如果没有孙子,那么subprocess就会得到0.我不知道是否正确?