Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux中使用fork()创建多个子项_C++_C_Linux_Operating System_Fork - Fatal编程技术网

C++ Linux中使用fork()创建多个子项

C++ Linux中使用fork()创建多个子项,c++,c,linux,operating-system,fork,C++,C,Linux,Operating System,Fork,我想使用fork()创建多个子项,但我面临一些问题。 比如: //这些是一些类对象的创建和调用 //有些函数是从另一个类调用的。我调用了大约5个函数。 //还有一些变量,比如。 pid_t pid; int status=0; char*x=新字符[10]; /////////////////////////这个for循环给了我多个孩子 //现在,在本例中,一位家长有多个孩子10 for(int i=0;i似乎您不知道fork()的作用。这使得您确信它是正确的函数似乎有些奇怪 请阅读: 乍一

我想使用
fork()
创建多个子项,但我面临一些问题。 比如:

//这些是一些类对象的创建和调用
//有些函数是从另一个类调用的。我调用了大约5个函数。
//还有一些变量,比如。
pid_t pid;
int status=0;
char*x=新字符[10];
/////////////////////////这个for循环给了我多个孩子
//现在,在本例中,一位家长有多个孩子10

for(int i=0;i似乎您不知道fork()的作用。这使得您确信它是正确的函数似乎有些奇怪

请阅读:


乍一看,子进程似乎得到了父进程内存的副本。

如果您分叉,我认为,所有对象和变量都将与父进程完全相同。我不理解“但我看到的是,它们会为每个子进程重新调用”这里重新调用的是什么?

当您使用fork时,您的子进程是父进程(包括堆)的副本。因此,您有一个单独的对象副本或使用new分配的内存。我不确定您重新调用的意思是什么,但如果您分配了一个对象,您将在两个单独的进程中的两个单独堆上有两个单独的对象在父级中使用new()。 一个是父进程中的原始堆,另一个是子进程中复制堆上的副本

这将有助于更好地理解:

的行为不会因您的意愿而改变

当进程叉时,有两个几乎相同的相同程序的副本。差异在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);
}
static char id[]=“\n\n\nSQLMONITOR版本3.5\n”;
类型定义内部管道[2];
int main(int argc,字符**argv)
{
int-pid;
管道到_sqlexec;
来自_sqlexec的管道;
setarg0(argv[0]);
写入(STDERR,id,sizeof(id)-1);
if(管道(到_sqlexec)<0 | |管道(从_sqlexec)<0)
错误(“无法创建管道”);
如果((pid=fork())<0,则为else
错误(“无法分叉”);
否则如果(pid==0)
幼稚(argv,to_sqlexec,from_sqlexec);
其他的
成为家长(从sqlexec到sqlexec);
返回(0);
}
be_childish()
函数继续执行一些管道操作(在执行另一个程序之前复制并关闭管道的适当部分。
be_parent())
进程继续从其标准输入读取消息,将它们记录到一个文件中,然后将消息写入
管道的写入端的子级的标准输入;然后从
管道的读取端从子级读取响应,并记录该消息,然后写入i因此,它将处于两个进程的中间,记录从一个到另一个进程的所有进程。进程之间的通信协议是同步的,极大地简化了生命。另一方面,当一个进程中的数据完成时,很难计算出。
select()
poll()
的广泛可用性;如今,它不需要对消息进行太多分析


然而,需要注意的关键是,在
fork()
之后的两个进程中,两个管道是相同的;实际上,唯一不同的变量是
pid
,它从
fork()
捕获返回值。其他所有的一切都与
fork()之前完全相同代码> 

你是用C还是C++编码?选择一个或另一个。很难理解你想要什么或者你的问题。我猜你不想让所有的对象都被代码< FoK()/<代码>拷贝的写行为复制。如果是的话,<代码> FoK()
对你没有帮助。如果你想共享对象,你必须使用线程而不是进程。你说的“reinvoked”是什么意思?好的。这不是一个困难的问题。但是你正在集中精力。非常感谢你。因此,在我的代码中有对象创建和函数调用。函数调用意味着我正在尝试一些系统资源,比如一些文件。现在,如果同一个内存正在分配。那么为什么它会打印我在fork之前编写的多个cout?为什么它会访问我的一次又一次地创建文件。关于每个子项的创建。我希望你能理解。告诉我哪里错了。请帮助我。谢谢,我知道这段代码正在做它应该做什么。我只想知道一个问题,对象和数据发生了什么。我在fork之前声明了。它需要一些线程工作。使用fork。好的。我想解释什么:obj1、 obj 2,obj 3,obj1();obj2();obj3();现在是i fork()。并执行fork implementation的所有操作。是否为每个孩子调用对象。我希望他们不应再次调用类。您将获得存储这些对象的内存副本。它们不会被重新分配,或其他任何操作,只是内存副本。也就是说,您的孩子将拥有相同的对象,但它们将使用单独的内存。那么你能告诉我创建多个子的确切方法吗?我希望一个父级应该有多个子级。我调用函数的对象。所有子级都有相同的副本并使用它们。你能告诉我吗?谢谢。谢谢你的回答。通过阅读互联网上的所有资料并进行搜索。我在rk我创造了什么样的程序状态。在fork之后
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);
}