subprocess拷贝整个数组吗?

我正在编写一个基本的UNIX程序,它涉及相互发送消息的进程。 我同意进程的想法是简单地有一个标志数组来指示进程是否已经到达代码中的某个点。

例如,我希望所有进程都等待,直到它们全部被创build。 我也希望他们在开始阅读他们的pipe道之前等到他们完成了彼此的消息发送。

我知道一个进程在写入一个以前定义的variables时执行写入时复制操作。

我想知道的是,如果我做了一个标志数组,将指向该数组的指针复制,或者将整个数组复制(从而使我的想法无用)。

我还想要关于进程间通信和进程同步的任何提示。

编辑:进程正在写入对方的过程'pipe道。 每个进程将发送以下信息:

typedef struct MessageCDT{ pid_t destination; pid_t source; int num; } Message; 

所以,只是消息的来源和一些随机数。 然后每个进程将输出消息到标准输出:沿着“进程20接收来自进程3的5724244”的行。

Unix进程有独立的地址空间。 这意味着一个内存与另一个内存完全分离。 当你调用fork()时,你会得到一个新的进程副本。 立即从fork()返回,两个进程之间唯一不同的是fork()的返回值。 两个进程中的所有数据都是相同的,但都是副本。 更新一个内存不能被另一个知道,除非你采取步骤共享内存。

Unix中的进程间通信(IPC)有很多种选择,包括共享内存,信号量,管道(命名和未命名),套接字,消息队列和信号。 如果你谷歌这些东西,你会发现很多要阅读。

在你的特定情况下,试图让多个进程等待,直到它们都到达某个点,我可能会使用一个信号量或共享内存,这取决于是否有一些主进程启动它们全部或不是。

如果有一个启动其他进程的主进程,那么主进程可以设置信号量,计数等于要同步的进程数量,然后启动它们。 然后,每个孩子可以减小信号值,等待信号值达到零。

如果没有主进程,则可以创建一个共享内存段,其中包含每个进程的进程数和标志。 但是当你有两个或多个使用共享内存的进程时,你还需要某种锁定机制(可能是一个信号量)来确保两个进程不会同时更新共享内存。

请记住,读取没有人写入的管道会阻塞读取器,直到出现数据。 我不知道你的流程是做什么的,但也许这足够同步了? 如果您有多个进程写入给定管道,另一个要考虑的事情是,如果写入大于PIPE_BUF,则其数据可能会交错。 这个宏的值和位置是依赖于系统的。

-Kevin

整个标志阵列似乎被复制。 它不会真正被复制,直到一个进程或另一个进程写入它当然。 但是这是一个实现细节,对个别进程是透明的。 就每个进程而言,他们每个都得到一个数组的副本。

有办法使这不会发生。 您可以使用mmapMAP_SHARED选项作为用于标记的内存。 然后每个子进程将共享相同的内存区域。 还有Posix共享内存(我,BTW,认为是一个可怕的黑客)。 要了解Posix共享内存,请查看shm_overview(7)手册页。

但以这种方式使用内存并不是一个好主意。 在多核系统中,当一个进程(或线程)写入一个共享内存区域时,并不总是这样,所有其他进程将立即看到写入的值。 这个值通常会在二级缓存中暂停一段时间,而不会立即刷新。

如果要使用共享内存进行通信,则必须使用互斥锁或C ++ 11原子操作来确保写入操作能够被其他进程正确地看到。