02 | linux下进程同步(信号量实现)
2022/4/21 7:28:52
本文主要是介绍02 | linux下进程同步(信号量实现),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/sem.h> /*程序目的: 1、完成两个进程的同步 2、每个进程进入临界区后输出一对字符 3、主进程输出‘X',其余进程输出'O' 4、主进程负责创建和销毁信号量 */ /*收获 1、深刻理解信号量是一种资源。它同样可以像文件那样指定key键值 2、同一个信号量(文件)key在不同的程序中被打开得到单属于该文件的“标识符” 3、创建信号量的同时需要指定权限 */ //该union为程序员自己写的,当然有的linux系统也是可以提供的 union semun{ int val; }; static int set_semvalue(void); static void del_semvalue(void); static int semaphore_p(void); static int semaphore_v(void); static int sem_id; //信号量标识符 int main(int argc,char *argv[]) { int i; int pause_time; char op_char = '0'; srand((unsigned int)getpid()); //第一个参数key_t相当于文件名, //第二个参数1代表指定需要的信号量数目它几乎总是1; //第三个参数为打开信号量的权限和标志。ipc_creat就算打开一个已有的信号量也不会错误 sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT); //主线程才会执行的代码负责信号量的创建 if (argc > 1) { if (!set_semvalue()) { fprintf(stderr, "failed to \ initialize semaphore\n"); exit(EXIT_FAILURE); } op_char = 'X'; sleep(2); } for (i = 0; i < 10; i++) { //进程临界区 if (!semaphore_p()) exit(EXIT_FAILURE); printf("%c", op_char); fflush(stdout); pause_time = rand() % 3; sleep(pause_time); printf("%c", op_char); fflush(stdout); //打印成对的字符 //退出临界区 if (!semaphore_v()) exit(EXIT_FAILURE); pause_time = rand() % 2; sleep(pause_time); } printf("\n%d-finished\n", getpid()); //由主进程负责销毁信号量 if (argc > 1) { sleep(10); del_semvalue(); } exit(EXIT_SUCCESS); } static int set_semvalue(void) { union semun sem_union; //控制信号量的初始化和销毁 sem_union.val = 1; //信号量的最大值为1 //semctl函数负责用来直接控制信号量信息。即初始化和销毁 //第一个参数 //第二个参数为信号量的个数,一般取值为0 //第三个参数代表初始化 //第四个参数为响应第三个参数:提供初始化值 if (semctl(sem_id, 0, SETVAL, sem_union) == -1) return 0; return 1; } static void del_semvalue(void) { union semun sem_union; //semctl函数负责用来直接控制信号量信息。即初始化和销毁 //第一个参数 //第二个参数为信号量的个数,一般取值为0 //第三个参数代表销毁 //第四个参数为响应第三个参数:提供初始化值 if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1) fprintf(stderr, "failed to delete semaphore\n"); } static int semaphore_p(void) { struct sembuf sem_b; sem_b.sem_num = 0; //对第几个信号进行操作,我们只有一个 sem_b.sem_op = -1;//P() sem_b.sem_flg = SEM_UNDO;//标识符:进程没有释放信号量终止则OS负责回收 //semop函数负责改变信号量的值 //第一个参数是信号量标识符 //第二个参数是指向一个结构数组的指针 //第三个参数为第二个参数的补充,数组内的元素 if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "semaphore_p failed\n"); return 0; } return 1; } static int semaphore_v(void) { struct sembuf sem_b; sem_b.sem_num = 0; sem_b.sem_op = 1;//V() sem_b.sem_flg = SEM_UNDO; if (semop(sem_id, &sem_b, 1) == -1) { fprintf(stderr, "semaphore_vfailed\n"); return 0; } return 1; }
这篇关于02 | linux下进程同步(信号量实现)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法