fork和exec关于锁定共享内存 - C

时间:2013-11-26 16:14:35

标签: c multithreading exec posix fork

所以我只是想知道我是否有一个简单的并发任务,我如何使用来自父进程的fork()和exec()进行多个进程,同时锁定父进程的某些方面'内存(以便它们不会相互覆盖),但以后可以将它们用于这些进程吗?

我知道我可以使用带有互斥锁的POSIX线程执行此操作,但是相同的过程是什么?有没有办法在线程之间“锁定”共享内存?然后我必须“等待()”让其他线程在其他线程可以访问它之前完成这些锁定的内存区域吗?

2 个答案:

答案 0 :(得分:0)

如果您正在使用互斥体的pthreads实现,您仍然可以使用它们在进程之间进行同步...您可以将它们放在共享内存中。 Initializing a pthread mutex in shared memory解决了这个问题。

您还可以使用简单的管道来同步访问 - 使用令牌预填充管道,并且需要成功读取令牌以允许资源访问。然后将令牌写回管道以释放资源。

答案 1 :(得分:0)

首先:如果您致电exec并且成功,那么您的过程影像将被覆盖。您将丢失任何共享内存,您需要使用您喜欢的共享内存范例(例如posix共享内存shm_open)进行设置。

如果您fork,那么映射共享的任何内存都将保持共享状态。表示您可以将喜爱的互斥锁(例如pthread_mutex_tsem_t)放入其中,并将其与标准函数一起使用。

void * shared_memory = mmap(
      NULL // anywhere
    , sysconf(_SC_PAGESIZE) // mmap only works in chunks of pages
                            // typically 0x1000
    , PROT_READ | PROT_WRITE // read-write
    , MAP_SHARED    // shared
    | MAP_ANONYMOUS // anonymous, non-file backed
    #ifdef MAP_HASSEMAPHORE
    | MAP_HASSEMAPHORE  // OS X requires this flag in case you
                        // intend to have semaphores in that segment
    #endif
    , -1 // no file backing
    , 0
    );

if (shared_memory == MAP_FAILED) {
    perror("mmap");
    abort();
}

// we use that memory to place a mutex tehre
pthread_mutex_t * mutex = shared_memory;

pthread_mutex_init(mutex, NULL);

pid_t pid = fork();

if (pid < 0) {
    perror("fork");
    abort();
}

if (!pid) {
    // child goes here
    // use the mutex here
} else {
    // parent goes here
    // use the mutex here
}