System V IPC指南2

    记得文件锁吧?信号量可被视为一种通用的锁定机制。你可以使用它们来控制文件访问权限,共享内存,还有,任何你想做的事情。信号量的基本功能是你可以设置它,检查它,或者等待直到它清除后再设置(test-n-set)。不管中间的过程多么复杂,记住这三个操作就够了。

此文档将提供一个有关信号量功能性的概述,文档结尾将提供一个使用信号量控制文件访问权限的程序.(这个任务,坦白讲的话,用文件锁会容易得多,但是它更适合你用用脑子来确定写东西)

抓取一些信号量
使用System VIPC,你不能抓取单个信号量;你能抓取信号量集。你当然可以抓取包含一个信号量的信号量集,但是关键是你能拥有一个完整的信号量,创建一个单个的信号量集。
如何创建信号量集呢?可以通过调用semget(),它返回一个信号量id(此后我们用semid来指称它):
    #include <sys/sem.h>

    int semget(key_t key, int nsems, int semflg);
key是什么东西?它是一个独一无二的标识符,被不同的进程用来标识这个信号量集。(这个可以使用ftok()来获得,在信息队列的文档里我们有提到过类似的情况)。
下一个参数,nsems,是(要不你先猜猜?)在此信号量集中信号量的个数。精确的数字是和系统相关的,但是它很有可能在500到2000之间。如果你需要更多的数字(你这贪婪的可怜虫!),那再找一个信号量集吧。
最后,semflg参数。它告诉semget()在新的信号量集中所需要给予的权限,你是否该创建一个新的集合,或者你只是想连接到一个已存在的信号量集上面,以及你能查询到的其他事情。如果需要创建一个新的集合,你可以按位设置或者使用IPC_CREAT的时候指定访问权限。

下面例子中使用ftok()创建了一个key,并创建了10个信号量集,权限为666(rw-rw-rw):
  #include <sys/ipc.h>
    #include <sys/sem.h>

    key_t key;
    int semid;

    key = ftok("/home/beej/somefile", 'E');
    semid = semget(key, 10, 0666 | IPC_CREAT);
恭喜恭喜!你已经创建了一个新的信号量集了!运行这个程序后,你可以用ipcs来看到它(别忘了使用ipcrm来删除它!)

semop():原子弹!
所有操作使用semop()系统调用来设置、得到、或test-n-set一个信号量。这个系统调用是通用的,它的功能受传递给的结构体所支配,
struct sembuf:

    struct sembuf {
        ushort sem_num;
        short sem_op;
        short sem_flg;
    };
显然,sem_num是集合中你想支配的信号量的个数。然后,sem_op是你要对信号量做的操作。根据sem_op是否是正,负,或零值,会给予不同的意义。
sem_op        会发生什么
正数        sem_op的值被加入到信号量的值中。这是程序使用信号量来标记分配的资源
负数        如果sem_op的绝对值比信号量的值要大,

零        此进程将持续等待直到信号量变为0
sem_op的值和他们的效果

你可能感兴趣的:(System)