了解使用信号量和共享内存的unix子进程

时间:2016-02-24 16:54:38

标签: c++ unix fork multiple-processes

我会按照我的理解尽力提出这个问题。

我正在进行一项编程任务(让我们现在解决这个问题)在Unix服务器上使用C或C ++来分叉四个子节点并使用信号量和共享内存来更新全局变量。我不确定我还有问题,但是我缺乏理解让我质疑我的结构。这是:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define NUM_REPEATS 10
#define SEM_KEY  1111
#define SHM_KEY  2222

int globalCounter = 0;

/***** Test function for confriming a process type ******/
int checkProcessType(const char *whoami)
{
  printf("I am a %s.  My pid is:%d  my ppid is %d\n",
  whoami, getpid(), getppid() );
  for(int i = 1; i<=3; i++){
    printf("%s counting %d\n", whoami, i);
  }
  return 1;
}

void 

int main (void) {

  pid_t process_id;       // PID (child or zero)
  int sharedMemID;        // Shared memory ID
  int sharedMemSize;      // shared memory size
  struct my_mem * sharedMemPointer;   // pointer to the attached shared memory

  // Definition of shared memory  //
  struct my_mem {
    long counter;
    int parent;
    int child;
  };

  // Gathering size of shared memory in bytes //
  sharedMemSize = sizeof(my_mem);
  if(sharedMemSize <= 0){
    perror("error collection shared memory size: Exiting...\n");
    exit(0);
  }

  // Creating Shared Memory //
  sharedMemID = shmget(SHM_KEY, sharedMemSize, 0666 | IPC_CREAT);
  if (sharedMemID < 0) {
    perror("Creating shared memory has failed: Exiting...");
    exit(0);
  }

  // Attaching Shared Memory //
  sharedMemPointer = (struct my_mem *)shmat(sharedMemID, NULL, 0);
  if (sharedMemPointer == (struct my_mem*) -1) {
    perror("Attaching shared memory has failed. Exiting...\n");
    exit(0);
  }

  // Initializing Shared Memory //
  sharedMemPointer->counter = 0;
  sharedMemPointer->parent = 0;
  sharedMemPointer->child = 0;

  pid_t adder, reader1, reader2, reader3;
  adder = fork();
  if(adder > 0)
  {
    // In parent

    reader1 = fork();
    if(reader1 > 0)
    {
      // In parent

      reader2 = fork();
      if(reader2 > 0)
      {
        //In parent

        reader3 = fork();
        if (reader3 > 0)
        {
          //In parent

        }
        else if (reader3 < 0)
        {
          // Error
          perror("fork() error");
        }
        else
        {
          // In reader3

        }
      }
      else if(reader2 < 0)
      {
        //Error
        perror("fork() error");
      }
      else
      {
        // In reader2

      }
    }
    else if(reader1 < 0)
    {
      // Error
      perror("fork() error");
    }
    else
    {
      // In reader1

    }
  }
  else if(adder < 0 )
  {
    // Error
    perror("fork() error");
  }
  else
  {
    // In adder
    //LOOP here for global var in critical section
  }


}

只是我正在做的一些信息(我认为),我创建了一个包含变量的共享内存块,让我们称之为counter,它将严格由adder以及在所有子进程处于活动状态后成为减法器的父级。我还在试图找出我将使用的信号量,因此加法器和减法器在关键部分执行,但我的主要问题是这个。

我怎么知道我在这个结构中的位置?我的加法器应该有一个可以完成某项工作的循环(更新全局变量),并且父/减法器应该有一个循环用于其作业(也更新全局变量)。所有readers都可以随时查看。父/减法器的循环放置是否重要?我基本上有3个位置,我知道我会在父母身边。但是因为所有的孩子都需要先创建,所以必须在我的第三个叉子之后的最后一个条件中,我知道我在父母身边吗?当我使用我的测试方法时,我得到分散的输出,这意味着一个孩子可以在父母的输出之后,然后是三个孩子,等等。它从不以任何顺序,并且从我对叉子的理解来看,#39 ; s预期。

我真的有三个问题正在进行,但我需要首先围绕结构。所以,让我再次简洁地再次说明这一点,没有任何垃圾,因为我已经挂断了循环和关键部分的位置,甚至还没有写入。

更直接的是,父母什么时候知道所有孩子的存在,并且通过这种结构可以让一个孩子完成任务并以某种方式回到它(即加法器/第一个孩子一次添加到全局变量,退出,其他一些孩子可以做它的事情等。)

我仍然觉得我没有问正确的事情,我相信这是因为仍然试图掌握概念。希望我的口吃能够显示出我在概念上所困扰的东西。如果没有,我可以澄清。

0 个答案:

没有答案