信号量集linux,使用信号量集的linux-12-IPC通信

7-810-jpg_6-1080-0-0-1080.jpg

1. 信号量设置

1.1概念

(1)什么是信号量?

信号量是用于控制同时访问资源的进程数并解决有限资源分配问题的计数器

(2)什么是信号量集?

信号量集是指信号量的集合,它是多个信号量的数组,可以同时控制多个资源的分配

1.2计数器的工作方式

(1)首先将计数器初始化为最大值

(2)如果有申请资源的流程,则计数将减少1

(3)计数器的值为0时,资源申请过程终止,资源申请过程被阻塞

(4)进程释放资源信号量集,并且计数增加1

7fb8241da9085aaa10808cfbe646024b.png

(5)如果计数器的值大于0,则被阻塞的进程可以获得共享资源,直到计数为0,其他进程继续阻塞

1.3使用信号量集的通信过程

(1)获取密钥值,直接分配它或使用ftok函数生成它

(2)创建/获取信号量集,使用semget函数

(3)初始化信号量集,初始化指定的信号量,使用semctl函数

(4)操作信号量集,添加/减去指定的信号量,使用semop函数

(5)如果不再使用信号量集,则可以删除该信号量集并使用semctl函数

1.4功能分析

(1)semget函数

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

第一个参数: 特定的键值可通过ftok函数获取

1866e007676ed4ded74a7cccc75f60bf.png

第二个参数: 信号量集的大小信号量集,即信号量的数量

第三个参数: 信号量集IPC_CREAT的操作方法-如果不存在,则获取IPC_EXCL-如果存在,则创建-如果存在则失败-获取信号集,否则将失败

返回值: 成功返回信号量集的ID,如果失败则返回-1.

功能功能: 创建/获取信号量集

注意: 创建信号量集时,需要在第三个参数(2)semctl函数中指定该信号量集的权限

int semctl(int semid,int semnum,int cmd,...);

第一个参数: 信号量集的ID

第二个参数: 表示信号量集的下标

第三个参数: 指示特定操作SETVAL-设置信号量集中信号量信号量的值,该特定值集由arg确定. valIPC_STAT-将semid指定的信号量集信息复制到arg. buf中的IPC_SET-set信号量集IPC_RMID根据arg.buf中的内容为Semid指定-删除信号量集的第四个参数:

工会semun {int val; / *在第三个参数SETVAL * /

时使用

6170785b84d9b3fbe9396466d8013320.png

struct semid_ds * buf; / * IPC_STAT,IPC_SET * /无符号短* array; / * GETALL,SETALL * /

struct seminfo * __ buf; / * IPC_INFO * /}

struct semid_ds {

struct ipc_perm sem_perm; / *所有者和权限* /

time_t sem_otime; / *最后一次使用semop * /

time_t sem_ctime; / *最后更改时间* /

unsigned short sem_nsems; / *信号灯数量* /};

struct ipc_perm {

key_t __key; / *键值* /

uid_t uid; / *有效的用户ID * /

gid_t gid; / *有效的用户组ID * /

tcj98rvg6n.jpeg

uid_t cuid; / *创建者的用户ID * /

gid_t cgid; / *创作者的组ID * /

无符号短模式; / *权限* /

无符号短__seq; / *序列号,无论如何* /}

返回值: 成功返回值根据cmd不同,失败返回-1

(3)演示功能

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

第一个参数: 信号灯集的ID

第二个参数: 结构指针

无符号短sem_num; / *信号集中的下标* /

short sem_op; / *对于特定操作,正数增加而负数减少* /

short sem_flg; / *默认情况下,0表示阻止,而IPC_NOWAIT表示不阻止* /

第三个参数: 信号量集的大小

返回值: 0表示成功,-1表示失败

函数功能: 对Semid指向的信号集中的nsops信号执行特定操作

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-281256-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下,进程之间可以通过信号量进行通信。下面是使用信号量实现进程通信的步骤: 1. 定义一个信号量:可以使用`semget`函数创建信号量,指定信号量的键值、信号量数量、权限等参数。 2. 初始化信号量:可以使用`semctl`函数对信号量中的信号量进行初始化,设置初始值。 3. 修改信号量的值:可以使用`semop`函数对信号量进行操作,包括增加、减少等操作,以达到进程间通信的目的。 4. 删除信号量:可以使用`semctl`函数删除信号量。 下面是一个简单的示例代码,其中包括两个进程,一个进程增加信号量的值,另一个进程减少信号量的值: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/sem.h> #define SEM_KEY 0x1234 int main() { int semid, ret; struct sembuf sops; // 创建信号量 semid = semget(SEM_KEY, 1, IPC_CREAT | 0666); if(semid < 0) { perror("semget"); exit(1); } // 初始化信号量值为1 ret = semctl(semid, 0, SETVAL, 1); if(ret < 0) { perror("semctl"); exit(1); } // 创建子进程 pid_t pid = fork(); if(pid < 0) { perror("fork"); exit(1); } else if(pid == 0) { // 子进程:减少信号量的值 sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0; ret = semop(semid, &sops, 1); if(ret < 0) { perror("semop"); exit(1); } printf("Child process: semaphore value=%d\n", semctl(semid, 0, GETVAL)); } else { // 父进程:增加信号量的值 sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0; ret = semop(semid, &sops, 1); if(ret < 0) { perror("semop"); exit(1); } printf("Parent process: semaphore value=%d\n", semctl(semid, 0, GETVAL)); } // 删除信号量 ret = semctl(semid, 0, IPC_RMID, 0); if(ret < 0) { perror("semctl"); exit(1); } return 0; } ``` 在这个示例中,我们使用`semget`函数创建了一个信号量,然后使用`semctl`函数对信号量进行初始化,设置初始值为1。接着创建了一个子进程和一个父进程,子进程使用`semop`函数减少信号量的值,父进程使用`semop`函数增加信号量的值。最后使用`semctl`函数删除信号量。 注意:信号量是多进程之间进行同步操作的一种机制,需要注意同步的正确性,避免出现死锁等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值