linux的信号量通信

来源:互联网 发布:怎么学习电脑编程 编辑:程序博客网 时间:2024/06/05 08:09
查看共享信息的内存的命令是ipcs [-m|-s|-q] (全部的话是ipcs -a) ;查看共享信息的内存的命令是ipcs [-m|-s|-q]
信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量。这里主要讨论二进制信号量.
P操作: 负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。
操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞;
V操作: 负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。
操作为: 释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。
1.semget()
int semget(key_t key, int nsems, int semflg);
一个参数 key是整数值(唯一非零),不相关的进程可以通过它访问一个信号量,它代表程序可能要使用的某个资源,程序对所有信号量的访问都是间接的,程序先通过调用semget函数并提供一个键,再由系统生成一个相应的信号标识符(semget函数的返回值),只有semget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。如果多个程序使用相同的key值,key将负责协调工作。
第二个参数num_sems指定需要的信号量数目,它的值几乎总是1。
第三个参数sem_flags是一组标志,当想要当信号量不存在时创建一个新的信号量,可以和值IPC_CREAT做按位或操作。设置了IPC_CREAT标志后,即使给出的键是一个已有信号量的键,也不会产生错误。而IPC_CREAT | IPC_EXCL则可以创建一个新的,唯一的信号量,如果信号量已存在,返回一个错误。
semget函数成功返回一个相应信号标识符(非零),失败返回-1
2,semop()
它的作用是改变信号量的值
int semop (int semid, struct sembuf *sops, unsigned nsops);
struct sembuf{    short sem_num;//除非使用一组信号量,否则它为0    short sem_op;//信号量在一次操作中需要改变的数据,通常是两个数,一个是-1,即P(等待)操作,                    //一个是+1,即V(发送信号)操作。    short sem_flg;//通常为SEM_UNDO,使操作系统跟踪信号,                    //并在进程没有释放该信号量而终止时,操作系统释放信号量};
3,semctl()
int semctl(int semid, int semnum, int cmd, ...);
union semun{    int val;    struct semid_ds *buf;    unsigned short *arry;};
前两个参数与前面一个函数中的一样,command通常是下面两个值中的其中一个
SETVAL:用来把信号量初始化为一个已知的值。p 这个值通过union semun中的val成员设置,其作用是在信号量第一次使用前对它进行设置。
IPC_RMID:用于删除一个已经无需继续使用的信号量标识符。

参考来自:blog.csdn.net/ljianhui/article/details/10243617



0 0
原创粉丝点击