在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]... %d\n", 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道或线程来实现。

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

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

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

你能举个例子吗?

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

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

在执行另一个程序之前, be_childish()函数继续做一些管道工作(复制和关闭管道的相应部分be_parental()进程继续从标准输入中读取消息,将它们记录到文件中,消息写入to_sqlexec管道写入端的子标准输入;然后从from_sqlexec管道的读取端读取子对象的响应,并记录该消息,然后将其写入其中标准输出,因此,它将处于两个进程中间,记录从一个到另一个进程的所有内容,进程之间的通信协议是同步的,这大大简化了生活,另一方面,当一个进程的数据完成时,代码早于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;

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

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