进程间通信学习APUE学习---进程间通信(4)

文章结束给大家来个程序员笑话:[M]

    这篇文章介绍下信号量,信号量的功能并不是进程间通信,是进程间同步。在线程部份已提到过信号量的概念,用到的是匿名信号量,能够实现线程间的同步。

    上篇文章中

    一样Linux提供给我们两种信号量:SystemV的信号量和Posix的信号量。

    仍然是先来看下Posix的信号量(须要-lrt),相关函数如下:

sem_t *sem_open(const char *name, int oflag);

sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);

int sem_close(sem_t *sem);

int sem_unlink(const char *name);

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

int sem_post(sem_t *sem);

int sem_getvalue(sem_t *sem, int *sval);

    匿名信号量应用sem_init()函数来打开,而定名信号量应用sem_open()来打开,相关操作和共享内存是类似的。应用sem_close()关闭 sem_unlink()删除。信号量的电灯灭灯操作和匿名信号量是一样的。

    SystemV的信号量其实并不是信号量而是信号量集,是多个信号量的集合(当然可以只有一个)。创建/打开信号量的函数是semget():

int semget(key_t key, int nsems, int semflg);

    这个函数在应用上和msgget() shmget()是类似的,除了多一个nsems参数,表示的是信号量会合信号量的个数。

    SystemV信号来那个的初始化和获得/设置值应用semctl()函数:

    每日一道理
灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否,那都是一样的,珍珠点缀,水晶加饰的灯它只能用以装饰,来满足人们的虚荣心,比起这,普普通通的日光灯是幸运的,因为它照明的本性没有改变,如同生活中的一部份人平平凡凡却实实在在。
int semctl(int semid, int semnum, int cmd, .../* union semnum arg */);

    cmd:

    IPC_RMID(删除信号量) SETVAL(设置第semnum信号量的值) GETVAL(获得semnum信号量的值)SETALL(设置全部信号量的值) GETALL(获得全部信号量的值)

    相关值是又公用体arg传递的,union semnum的结构:

union semun {

      int   val;    /* Value for SETVAL */

      unsigned short  *array;  /* Array for GETALL, SETALL */

};

    如果是SETVAL GETVAL应用的val,GETALL SETALL应用的array。

    信号量的PV操作(点灯 灭灯),应用semop停止操作:

int semop(int semid, struct sembuf *sops, unsigned nsops);

    sops是操作数组,nsops是数组的长度。struct smebuf的结构如下:

struct sembuf {

       unsigned short sem_num;     /*   semaphore number   */

       short sem_op;                      /*  semaphore operation  */

       short sem_flg;                     /*   operation flag            */

};

    sem_num是操作的第几个信号量,sem_op是执行的PV操作,如1 2 -1 -2。sem_flg是参数,包括:

    IPC_NOWAIT(对信号的操作不能满足时,semop()不会阻塞,当即返回并设置errno)、

    SEM_UNDO(将会自动撤消该进程终止时)。

    



文章结束给大家分享下程序员的一些笑话语录: 乔布斯:怎么样还是咱安全吧!黑客:你的浏览器支持国内网银吗?苹果可以玩国内的网游吗乔布斯:......不可以黑客:那我研究你的漏洞干嘛,我也需要买奶粉!

--------------------------------- 原创文章 By
进程间通信和学习
---------------------------------

你可能感兴趣的:(学习)