创建进程的多个子进程并维护其所有 PID 的共享数组

Posted

技术标签:

【中文标题】创建进程的多个子进程并维护其所有 PID 的共享数组【英文标题】:Creating multiple children of a process and maintaining a shared array of all their PIDs 【发布时间】:2014-10-02 13:03:53 【问题描述】:

我已经分叉了几次,并在 C 中创建了一堆子进程。我想将它们的所有 PID 存储在一个共享数组中。 PID 的顺序无关紧要。例如,我创建了 32 个进程。我想要一个 32 整数长的数组来存储它们的每个 PID,并且每个进程都可以访问它们。什么是最好的方法来做到这一点。

【问题讨论】:

看看这个***.com/questions/9147760/how-to-get-child-pid-in-c,您应该能够将该值存储在任何选择的数组中。 你用 fork(2) 调用分叉了吗?如果是这样,子进程将有一个新的地址空间,因此没有共享内存。如果您真的想这样做,则必须以其他方式创建共享内存映射,例如在第一次 fork()'ing 之前打开的文件描述符上使用 mmap()。然后,您可以将每个 fork() 的返回值存储在该区域中(它将在父线程中返回子进程 PID,在子线程中返回 0)。您可能应该探索使用 pthreads 而不是 fork,如果您需要共享内存,它的资源密集度也较低,并且具有互斥锁等。 您需要使用mmap。但最好让子进程知道它们是哪个索引。 【参考方案1】:

这是一个程序,说明了您使用 mmap() 想要什么:

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

#define MAX_PIDS 32

volatile pid_t *pids;

// Called for each child process
void do_child(void)

  int c;
  printf("Child: %d - pid array: ", getpid());

  for (c=0; c<10; c++) 
    printf("%d%s", pids[c], c==9?"\n":" ");
  


int main(int argc, char **argv)

  int c;
  pid_t pid;

  // Map space for shared array
  pids = mmap(0, MAX_PIDS*sizeof(pid_t), PROT_READ|PROT_WRITE,
              MAP_SHARED | MAP_ANONYMOUS, -1, 0);
  if (!pids) 
    perror("mmap failed");
    exit(1);
  
  memset((void *)pids, 0, MAX_PIDS*sizeof(pid_t));

  // Fork children
  for (c=0; c<10; c++) 
    pid = fork();
    if (pid == 0) 
      // Child process
      do_child();
      exit(0);
     else if (pid < 0) 
      perror("fork failed");
     else 
      // Store in global array for children to see
      pids[c] = pid;
      sleep(1);
    
  
  exit(0);

【讨论】:

以上是关于创建进程的多个子进程并维护其所有 PID 的共享数组的主要内容,如果未能解决你的问题,请参考以下文章

从一个进程创建多个共享内存

父子进程共享资源的关系

父进程和子进程

父进程和子进程

Linux下复杂PC问题——多进程编程/信号量通信/共享存储区

在 C++ 中创建多个进程并与管道通信