【发布时间】:2020-07-25 00:15:46
【问题描述】:
我有一个程序,它创建一些共享内存来共享一些数据和一些信号量,在那里写入一些数据,然后其他进程连接到它并读取该数据并执行一些操作,使用由创建的未命名信号量在它们之间进行同步第一个过程。
完成所有操作后,是否只有在所有其他进程都完成后才能销毁信号量(使用 sem_destroy())?或者如果我让第一个进程等待其他进程完成它们的工作然后销毁信号量会更好吗?有了这个,我想我应该实现任何沟通渠道,但不知道该怎么做。
编辑:提供一些代码
这是我创建共享内存简化的编写过程(省略了错误处理):
int fd_shm = shm_open(SHM_NAME, O_RDWR | O_CREAT | O_EXCL,S_IRUSR | S_IWUSR);
/* Resize the memory segment */
ftruncate(fd_shm, sizeof(ShmExampleStruct))
/* Map the memory segment */
ShmExampleStruct *example_struct = mmap(NULL, sizeof(*example_struct), PROT_READ | PROT_WRITE, MAP_SHARED,fd_shm, 0);
close(fd_shm);
sem_init(&(example_struct->sem), 1, 1)
在 ShmExampleStruct 中,我得到了数据和信号量。 在这段代码之后,它将一些数据写入example_struct
而读取过程代码可能是这样的:
/* We open the shared memory */
int fd_shm = shm_open(SHM_NAME, O_RDONLY, 0);
/* Map the memory segment */
ShmExampleStruct *example_struct = mmap(NULL, sizeof(*example_struct), PROT_READ, MAP_SHARED, fd_shm, 0);
close(fd_shm);
然后从 example_struct 中读取一些内容
如果我启动写入进程,然后启动一些读取进程,那么破坏信号量的最佳方法是什么?理论上,写作过程应该在阅读之前开始和结束。
【问题讨论】:
-
您在使用
sem_init作为您的信号量吗?它们是否与数据位于同一共享内存中?你是如何创建你的共享内存的?请提供一些 C 代码来补充您的问题。 -
我现在提供了一些代码。是的,我使用 sem_init,信号量与数据位于同一共享内存中,我使用 shm_open、ftruncate 和 mmap 创建共享内存
标签: c multiprocessing semaphore