微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Linux中使用fork创build多个子项

我想用fork()创build多个子项,但是我遇到了问题。 喜欢:

///////////////////////// these are some class objects creation and calling // There are some functions calling from another class. about 5 functions I invoked. // and some variables like. pid_t PID; int status = 0; char *x = new char[10]; ///////////////////////// This for loop give me multiple children // Now one parent have multiple children in this case 10 for( int i=0; i<10; i++ ) { mNo++; rNo++; PID = fork(); if( PID == FORK_ERROR ) // fork ERROR! { fprintf(stderr,"ERROR! In fork() [FORCE EXITING]... %dn",errno); exit(EXIT_FAILURE); } else if( PID == CHILD ) // Do Child Stuff Here... { exit(status); } else // Do parent Stuff Here... { } } PID = wait(&status); ////////////////////////////////////////////

这是我执行的代码,但有一些问题。

我想问,当我在内存中创build一个孩子时,它会创build重复的内存。 也是我宣布的对象; 他们通过调用fork()重新调用,那么这是否意味着每个孩子都有内存中的对象被重新调用类?

我想,如果我叉,和以前的函数调用和variables应该是每个孩子相同,但不是非幂等函数。 我希望你得到它。 我知道这是一个非常简单的问题,但是我正在处理的项目非常关键,它必须用fork()而不是pipe道或线程来实现。

MEMORY_BASIC_@R_381_4045@ION结构中的BaseAddress和AllocationBase有什么区别?

用windows8上的C读取引导扇区

通过进程ID查找进程名称

监视目录中的文件更改

DLL和registry有什么问题?

此外,我重复我的问题,如果我fork() ,对象和variables会发生什么。 在调用fork之前,他们是重新分配还是再次为每个孩子重新调用? 但是我所看到的是,他们是为每个我不想要的孩子重新获得的。 那我该怎么做?

标准input可用性(竞争条件?)

无法更新ICEAuthority文件/home/neha/.ICEAuthority

python:无法从windows上的os.execl'd python脚本中删除打开的文件

上下文切换进程

可变上下文切换时间

fork()的行为不会改变以适应您的愿望。

当进程分叉时,同一个程序有两个几乎相同的副本。 这些差异在POSIX手册页(上面的链接)中列出。 内存是一样的。 例如,C ++中的对象将不会被重新构建。 例如,在每个进程中,所有的单身仍然是单身。

你能举个例子吗?

下面是我在1991年写的完整的主程序。我只更新了main()的原型,并且包含了Pipe的typedef和id的定义:

static char id[] = "nnn@R_404_6308@MONITOR version 3.5 n"; typedef int Pipe[2]; int main(int argc,char **argv) { int pid; Pipe to_@R_404_6308@exec; Pipe from_@R_404_6308@exec; setarg0(argv[0]); write(STDERR,id,sizeof(id)-1); if (pipe(to_@R_404_6308@exec) < 0 || pipe(from_@R_404_6308@exec) < 0) error("unable to create pipes"); else if ((pid = fork()) < 0) error("unable to fork"); else if (pid == 0) be_childish(argv,to_@R_404_6308@exec,from_@R_404_6308@exec); else be_parental(to_@R_404_6308@exec,from_@R_404_6308@exec); return(0); }

在执行另一个程序之前, be_childish()函数继续做一些管道工作(复制和关闭管道的相应部分be_parental()进程继续从标准输入中读取消息,将它们记录到文件中,消息写入to_@R_404_6308@exec管道写入端的子标准输入;然后从from_@R_404_6308@exec管道的读取端读取子对象的响应,并记录该消息,然后将其写入其中标准输出,因此,它将处于两个进程中间,记录从一个到另一个进程的所有内容,进程之间的通信协议是同步的,这大大简化了生活,另一方面,当一个进程的数据完成时,代码早于select()和poll()的广泛使用,现在不需要做太多的消息分析。

但是,要注意的关键是这两个管道在fork()之后的两个进程中是相同的。 实际上,唯一不同的变量是捕获fork()的返回值的pid 。 其他的一切都和fork()之前一样。

当你分叉时,你的孩子是父进程的副本,包括堆。 因此,你有一个单独的副本对象或使用新分配的内存。 我不知道你的意思是通过重新调用,但是如果你在父对象中使用new()分配了一个对象,你将在2个独立的进程中的2个独立的堆上有2个独立的对象。 一个是父进程中的原始进程,另一个是子进程中复制的堆的副本。

这将有助于更好地理解: 在堆内的Linux内部类fork

好像你不知道fork()是做什么的。 这让你相信这是正确的功能,这看起来很奇怪。

阅读它:

http://linux.die.net/man/2/fork

http://en.wikipedia.org/wiki/Fork_(operating_system&#xFF09;

一眼看来,子进程似乎获得了父进程的一个副本。

如果你分叉,我认为,所有的对象和变量将与父进程完全相同。 我不明白“但是我看到他们是为了每个孩子而重新获得帮助的”,这里被重新调教了什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐