1

次のコードでは、ミューテックスはその親のコピーとして子に作成されませんか?したがって、現在、ミューテックスのコピーが2つあります。1つは子に、もう1つは親にあります。どうすれば同期できますか?私が覚えている限り、同期させるには、複数のプロセスで共有される1つのコピーが必要です。

  #include <semaphore.h>
  #include <stdio.h>
  #include <errno.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <sys/mman.h>

  int main(int argc, char **argv)
  {
    int fd, i,count=0,nloop=10,zero=0,*ptr;
    sem_t mutex;

    //open a file and map it into memory

    fd = open("log.txt",O_RDWR|O_CREAT,S_IRWXU);
    write(fd,&zero,sizeof(int));

    ptr = mmap(NULL,sizeof(int), PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

    close(fd);

    /* create, initialize semaphore */
    if( sem_init(&mutex,1,1) < 0)
      {
        perror("semaphore initilization");
        exit(0);
      }
    if (fork() == 0) { /* child process*/
      for (i = 0; i < nloop; i++) {
        sem_wait(&mutex);
        printf("child: %d\n", (*ptr)++);
        sem_post(&mutex);
      }
      exit(0);
    }
    /* back to parent process */
    for (i = 0; i < nloop; i++) {
      sem_wait(&mutex);
      printf("parent: %d\n", (*ptr)++);
      sem_post(&mutex);
    }
    exit(0);
  }
4

1 に答える 1

1

mutexaと a を混同してはなりませんsemaphoresemaphoreは、複数のスレッド/プロセスがリソースにアクセスすることを許可する場合がありますが、リソースへの同時アクセスmutexは 1 つのみ許可します。ここで
述べたように、クロスプロセス同期を可能にするために を作成する必要があります。親プロセスで を作成する必要があり、アクセスは子プロセスで使用して同期を実現します。named semaphoresemaphoresem_open

于 2013-03-21T20:56:56.380 に答える