清单 6 显示了运行的示例的两个实例,这两个实例分别具有名称 a 和 b。首先,a 获得信号量,在 a 拥有该信号量的同时,b 尝试获得一个锁。一旦释放了信号量,b 即获得锁。现在情况颠倒过来,变为等待 b 完成。最后,a 在信号量被释放后再次获得该信号量,因为 b 没有等待。
关于信号量,要注意的最后一个事项在于,它们被称为建议锁(Advisory Lock)。这意味着信号量本身并不阻止两个进程同时使用同一个资源;相反,它们旨在建议任何进程自愿询问该资源是否正在使用。
共享内存空间
共享内存也许是最强大的 SysV IPC 方法,并且此方法最容易实现。顾名思义,共享内存是在两个进程之间共享一个内存块。清单 7 显示了一个程序,该程序调用 fork(2) 来将自身划分为一个父进程和一个子进程,两个进程之间使用一个共享内存段进行通信。
清单 7. 演示共享内存用法的程序
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(void) {
pid_t pid;
int *shared; /* pointer to the shm */
int shmid;
shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
if (fork() == 0) { /* Child */
/* Attach to shared memory and print the pointer */
shared = shmat(shmid, (void *) 0, 0);
printf("Child pointer %pn", shared);
*shared=1;
printf("Child value=%dn", *shared);
sleep(2);
printf("Child value=%dn", *shared);
} else { /* Parent */
/* Attach to shared memory and print the pointer */
shared = shmat(shmid, (void *) 0, 0);
printf("Parent pointer %pn", shared);
printf("Parent value=%dn", *shared);
sleep(1);
*shared=42;
printf("Parent value=%dn", *shared);
sleep(5);
shmctl(shmid, IPC_RMID, 0);
}
}
标签: