Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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
在execvp()之后,如何在父进程和子进程之间最佳地共享数组?_C_Shared Memory_Execvp - Fatal编程技术网

在execvp()之后,如何在父进程和子进程之间最佳地共享数组?

在execvp()之后,如何在父进程和子进程之间最佳地共享数组?,c,shared-memory,execvp,C,Shared Memory,Execvp,假设有一个数组A在进程X和Y之间共享,其中X集中在数组的前半部分,Y集中在后半部分。X是否可以在A上“就地”对其数组的一半进行排序,同时Y对其一半进行排序?它是相同的共享内存段,但该段中的地址不同。这会导致未定义的行为吗 换句话说,我的教授说不要让进程同时改变共享内存,但只有当它们在彼此相同的位置改变数据时,才会这样做吗 如果重要的话,我们在课堂上使用C89 编辑: 因为我所问的可能是一个不必要的解决方案(由于XY问题),所以需要更多的上下文 我们正在编写一个使用多进程、共享内存和execvp的

假设有一个数组A在进程X和Y之间共享,其中X集中在数组的前半部分,Y集中在后半部分。X是否可以在A上“就地”对其数组的一半进行排序,同时Y对其一半进行排序?它是相同的共享内存段,但该段中的地址不同。这会导致未定义的行为吗

换句话说,我的教授说不要让进程同时改变共享内存,但只有当它们在彼此相同的位置改变数据时,才会这样做吗

如果重要的话,我们在课堂上使用C89

编辑: 因为我所问的可能是一个不必要的解决方案(由于XY问题),所以需要更多的上下文

我们正在编写一个使用多进程、共享内存和execvp的MergeSort程序。目前,我们有两个文件main.c和merge.c,其中main读取一个输入文件,其中包含要排序的int数组的大小和内容。我们被指示将数组存储在共享内存段中,并使用execvp()调用merge.c。然后,merge.c还应该使用execvp()调用自身以递归方式拆分数组,在数组有两个元素长时进行排序,然后“返回”到其父元素并在向上合并

这就是我的问题所在: 我不知道如何在不使用新的共享内存段的情况下将已排序的二元素(和四元素等)数组“返回”到其父元素。也许有一种更简单的方法可以做到这一点


如果我最初的问题是XY问题,我深表歉意。

如果进程不通过内存进行交互,那么首先为什么要使用共享内存?你的教授提出的观点可能是指实际的案例,在这些案例中,内存在访问模式中确实是共享的。如果从来没有重叠的访问,那么这两个进程将明显运行,不会出现任何并发问题。@kaylum希望我没有陷入XY问题中。。。我试图为X和Y的父对象提供一种访问其子对象修改的数据的方法。那么您有三个进程,父对象访问需要与子对象访问同步。但是,如果子进程正在访问共享内存的不同部分,则它们不需要相互担心。@kaylum所以我的方法应该可以工作,对吗?我之所以不做更简单的事情,是因为我们被告知对每个fork使用execvp,所以我不确定进程之间如何通信。你是对的-如果你能保证没有两个进程同时访问共享内存的同一部分,那么你的实现就可以了。您可以使用“合并排序”执行此操作,只要在两个子项完成之前,每个父项都不继续。