当前位置: 首页 > news >正文

Linux信号量的编程

一,用信号量来实现是父进程先进行,还是子进程先进性

信号量的没有P,V操作之前,我们不知道如何控制:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>//pid_t fork(void);
//int semget(key_t key, int nsems, int semflg);union semun
{int val;                //仅用于SETVAL操作类型,设置某个信号量的值等于valstruct semid_ds *buf;   //用于IPC_STAT和IPC_SET操作,存取semid_ds结构unsigned short *array;  //用于SETALL和GETALL操作struct seminfo *__buf;  //为控制IPC_INFO提供的缓存
};int main()
{key_t key;int semid;key = ftok(".",2);semid = semget(key, 1, IPC_CREAT|0666);union semun initsem;initsem.val = 1;semctl(semid, 0, SETVAL, initsem);int pid = fork();if(pid >0){//get lockprintf("this is father\n");//return lock;}else if(pid == 0){printf("this is child\n");}else{printf("fork error\n");}return 0;
}

有P,V操作:

一开始 val 表示信号量的钥匙为0,fork操作后,先运行父进程,pGetkey(semid); 拿钥匙发现val 为0 卡住,挂起,进而运行子进程,vPutBackKey(semid) ;操作放入钥匙然后再运行父进程。

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>//pid_t fork(void);
//int semget(key_t key, int nsems, int semflg);
//int semop(int semid, struct sembuf *sops, size_t nsops);
//int semctl(int semid, int semnum, int cmd, ...);union semun
{int val;                //仅用于SETVAL操作类型,设置某个信号量的值等于valstruct semid_ds *buf;   //用于IPC_STAT和IPC_SET操作,存取semid_ds结构unsigned short *array;  //用于SETALL和GETALL操作struct seminfo *__buf;  //为控制IPC_INFO提供的缓存
};void pGetKey(int id)
{struct sembuf set;set.sem_num = 0;set.sem_op = -1;set.sem_flg = SEM_UNDO;semop(id,&set, 1);printf("getKey\n");
}void vPutBackKey(int id)
{struct sembuf set;set.sem_num = 0;set.sem_op = 1;set.sem_flg = SEM_UNDO;semop(id,&set, 1);printf("put back the key\n");}int main(int argc, char const *argv[])
{key_t key;          // 创建id号int semid;          //信号量key = ftok(".",2);semid = semget(key, 1, IPC_CREAT|0666);union semun initsem;initsem.val = 0;          //信号量的状态标记为0//初始化信号量semctl(semid, 0, SETVAL, initsem);   //信号量  操作第0个信号量  //SETVAL 设置信号量的值 设置为 initsemint pid = fork();              //创建子进程if(pid >0){                    //父进程pGetKey(semid);        //get lockprintf("this is father\n");vPutBackKey(semid);    //return lock;}else if(pid == 0){printf("this is child\n");vPutBackKey(semid);}else{printf("fork error\n");}return 0;
}

http://www.lryc.cn/news/493318.html

相关文章:

  • “Yaker,你可以全局配置插件环境变量!“
  • SAAS美容美发系统架构解析
  • 如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间
  • vscode远程连接ssh
  • 智慧防汛平台在城市生命线安全建设中的应用
  • python实现TCP Socket控制测试仪器
  • 51c自动驾驶~合集38
  • 电脑显示器拔插DVI线后副屏不显示
  • Bash脚本常用命令
  • 《Unity Shader 入门精要》高级纹理
  • vue3实现自定义导航菜单
  • [2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(2))
  • EDA软件研发的DevOps平台
  • 从单机缓存到分布式缓存那些事
  • [Ubuntu20] Gym入门,Mujoco
  • Linux(ubuntu)系统的一些基本操作和命令(持续更新)
  • 【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?
  • android 安全sdk相关
  • NVR监测软件EasyNVR多个NVR同时管理:录播主机的5条常见问题与解决办法
  • Z2400027基于Java+SpringBoot+Mysql+thymeleaf引擎的图书馆管理系统的设计与实现 代码 论文
  • 完美解决Docker pull时报错:https://registry-1.docker.io/v2/
  • A051-基于Spring Boot的网络海鲜市场系统的设计与实现
  • 【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 树结构 封装为组件使用
  • Blender 运行python脚本
  • 递归:求fib数列的第n项,前几项是1,1,2,3,5,每一项都等于前面两项的和:JAVA
  • 三分钟快速掌握——Linux【vim】的使用及操作方法
  • Wrapper包装类
  • MySQL高级(六):全局锁、表锁和行锁
  • 【CLIP】3: semantic-text2image-search允许局域网访问
  • FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持