在process-1
中,我试图将数据写入共享内存。同时,在process-2
中,我正在从相同的共享内存中读取数据。在本例中,我需要在这两个进程之间提供同步。如果我将使用未命名的信号量(使用shm_init()、mmap()
),它是否有效?
我已经写了这样的代码,它会工作还是不工作?
fd = shm_open("shm_name", O_CREAT| O_RDWR, S_IRUSR | S_IWUSR);
sema = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE,MAP_SHARED , fd, 0);
sem_init(sema, 1, 1);
一般方法会奏效。但请注意以下几点:
shm_open(3)
的name
参数应以斜杠开头。改为传递“/shm_name”
。(在带有glibc的Linux上,它碰巧在没有斜杠IIRC的情况下工作。)ftruncate(2)
调整fd
的大小,否则在尝试访问共享内存时将获得sigbus
。每当mmap(2)
文件时,您在映射中访问的任何内存都必须实际存在于该文件中,POSIX共享内存对象的工作方式与此相同。(在Linux上,它们作为/dev/shm
下的文件实现,该文件使用内存中的tmpfs。)对于后者,您可以执行以下操作:
typedef struct Shared_mem {
sem_t sem;
int shared_data[100];
} Shared_mem;
...
shared_mem = mmap(NULL, sizeof(Shared_mem), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
...
sem_init(&shared_mem->sem, 1, 1);
null 更新 在OS X上,sem_init()没有按预期工作。使用sem_open()来解决这个问题。参考:http://lists.apple.com/archives/darwin-dev//2008/oct/msg00044.html
问题内容: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相同的信号量吗? 另外,假设我创建了一个内部带有信号灯并分叉的结构。所有子进程仍然使用相同的信号量吗?如果不是,将struct + semaphores存储在共享内存中是否允许子进程使用相同的信号量? 我对派生的子进程如何使用相同的信号量感到非常困惑。 问题答案: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相
为什么using指令在包含在匿名命名空间中时表现得好像出现在全局范围?
进程的管理主要是指进程的关闭与重启。我们一般关闭或重启软件,都是关闭或重启它的程序,而不是直接操作进程的。比如,要重启 apache 服务,一般使用命令"service httpd restart"重启 apache的程序。 那么,可以通过直接管理进程来关闭或重启 apache 吗?答案是肯定的,这时就要依赖进程的 信号(Signal)了。我们需要给予该进程号,告诉进程我们想要让它做什么。 系统中
头文件 semaphore.h sys/stat.h fcntl.h 常用函数 函数 说明 [[sem_open sem_open]] 打开一个有名信号量 [[sem_close sem_close]] 关闭一个信号量 [[sem_unlink sem_unlink]] 删除一个信号量 [[sem_post sem_post]] 【V操作】释放操作:信号量的值加1 [[sem_wait sem_w
这是进程2中的代码块,它应该捕捉信号量,但没有 因此,这个想法是--这个进程2应该在另一个进程的post/wait之间获得seemaphore--此时,共享的mem段中有数据,并且不是空的。然而,相反,它在另一个进程的最后捕获信号量,这时它已经清空了sahred内存段并删除了其中的任何数据。 我做了很多问题解决,并确认a)每个进程中的信号量都是相同的信号量b)进程1在某个时候会增加信号量,然后捕获