首页 > 系统相关 >设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进

设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进

时间:2024-06-12 19:54:37浏览次数:31  
标签:fp 共享内存 semid 信号量 集合 进程 include

设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。 提示:进程A、进程B、进程C需要使用共享内存作为临界资源的访问。

//进程A (create_shared_memory_and_semaphore.c)
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <fcntl.h>  
#include <sys/ipc.h>  
#include <sys/shm.h>  
#include <sys/sem.h>  
#include <sys/types.h>  
#include <unistd.h>  
  
#define SHM_SIZE 1024  
#define SEM_NAME "/my_semaphore"  
  
int main() {  
    key_t key = ftok("/tmp", 'R'); // 用于创建共享内存和信号量的唯一键  
  
    // 创建共享内存  
    int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);  
    if (shmid == -1) {  
        perror("shmget");  
        exit(1);  
    }  
  
    // 附加到共享内存  
    char *shm_ptr = (char *)shmat(shmid, NULL, 0);  
    if (shm_ptr == (char *)-1) {  
        perror("shmat");  
        exit(1);  
    }  
  
    // 写入一些数据到共享内存(可选)  
    strcpy(shm_ptr, "Hello from Process A!");  
  
    // 创建信号量集  
    int semid = semget(key, 1, IPC_CREAT | 0666);  
    if (semid == -1) {  
        perror("semget");  
        exit(1);  
    }  
  
    // 初始化信号量(初值为1)  
    union semun semopts;  
    semopts.val = 1;  
    if (semctl(semid, 0, SETVAL, semopts) == -1) {  
        perror("semctl");  
        exit(1);  
    }  
  
    // 假设我们将semid存储在文件中以便其他进程可以读取  
    FILE *fp = fopen(SEM_NAME, "w");  
    if (fp == NULL) {  
        perror("fopen");  
        exit(1);  
    }  
    fprintf(fp, "%d", semid);  
    fclose(fp);  
  
    // 分离共享内存(进程A不再需要访问共享内存,但为了演示目的我们保留它附加)  
    // shmdt(shm_ptr); // 注释掉,因为进程A还要保持运行以观察其他进程  
  
    // 等待其他进程完成(这里简单使用sleep模拟)  
    sleep(100); // 等待足够长的时间以便其他进程可以运行  
  
    // 清理(在真实场景中,你可能希望更优雅地处理清理)  
    // shmdt(shm_ptr);  
    // shmctl(shmid, IPC_RMID, NULL);  
    // semctl(semid, 0, IPC_RMID, NULL);  
  
    return 0;  
}
//进程B和进程C (access_shared_memory.c)
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <fcntl.h>  
#include <sys/ipc.h>  
#include <sys/shm.h>  
#include <sys/sem.h>  
#include <sys/types.h>  
#include <unistd.h>  
  
#define SHM_SIZE 1024  
#define SEM_NAME "/my_semaphore"  
  
int main() {  
    key_t key = ftok("/tmp", 'R'); // 与进程A相同的键  
  
    // 从文件中读取semid  
    FILE *fp = fopen(SEM_NAME, "r");  
    if (fp == NULL) {  
        perror("fopen");  
        exit(1);  
    }  
    int semid;  
    fscanf(fp, "%d", &semid);  
    fclose(fp);  
  
    // 获取共享内存  
    int shmid = shmget(key, SHM_SIZE, 0); //

标签:fp,共享内存,semid,信号量,集合,进程,include
From: https://www.cnblogs.com/liuliuye/p/18244602

相关文章

  • python指南之多线程与多进程编程大全
    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来提高并发执行效率。多线程与多进程的概念多线程多线程是指在同一进程内,多个线程并发执......
  • Java集合总结
    JAVA中常见的集合总结使用集合的好处:可以动态的保存任意多个对象,使用比较方便提供了一些列方便的操作对象的方法:add,remove,set,get等使用集合添加,删除元素的示意代码简洁明了集合主要分为两种:单列集合:集合中存放的是单个对象双列集合:集合中存放的是键值对对象C......
  • 使用 ps 查看进程的启动时间和运行时间
    用法ps-eopid,lstart,etime,cmd|grep<进程关键字>命令解释:lstartSTARTEDtimethecommandstarted.Seealsobsdstart,start,start_time,andstime.etimeELAPSEDelapsedtimesincetheprocesswasstarted,intheform[[DD-]......
  • 一文带你搞清楚Python的多线程和多进程
    本文分享自华为云社区《Python中的多线程与多进程编程大全【python指南】》,作者:柠檬味拥抱。Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来......
  • 多进程并发简易服务器代码实现
    多进程实现并发服务器多进程并发服务器.c架构intsockfd=socket()bian()listen()while(1){ acceptfd=accept() pid=fork() if(pid>0){ }elseif(pid==0){ while(1){ recv()/send() } }}注意:accept不能放在P......
  • C#——集合List
    listlist集合和Arraylist基本一样,只不过list是C#2.0版本新加入的范型类型。list也可以通过索引操作里面的元素,也有对list进行增删改查概念Array静态数组*Arraylist动态数组*list集合*1.Array是容量是固定的,但是ArrayList和list容量可以根据需要自动扩充,修改删除,插......
  • 【旅行使身体和灵魂都在路上】智慧旅游解决方案集合推荐,干货满满!
    引言:2024年端午节假期,全国文化和旅游市场总体平稳有序。据测算,全国国内旅游出游合计1.1亿人次,同比增长6.3%;国内游客出游总花费403.5亿元,同比增长8.1%。假期中,群众赛龙舟、吃粽子、唱山歌、赏古曲,传统节日文化内涵与旅游发展深度融合。广东、湖南、浙江、贵州、云南等地......
  • Java中List集合中多个字段如何排序
    开源项目SDK:https://github.com/mingyang66/spring-parent个人文档:https://mingyang66.github.io/raccoon-docs/#/一、首先定义一个三个属性的People类publicclassPeople{privateStringname;privateintage;privateintheight;publicPeople......
  • 设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量
    设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。提示:进程A、进程B、进程C需要使......
  • 浅析嵌入式实时系统中信号量的概念
    目录概述1.认识信号量1.1定义信号量1.2信号量的类型1.2.1二值信号量1.2.2计数信号量1.2.3互斥信号量1.2.3.1认识互斥信号量1.2.3.2互斥信号量的其他特性2典型信号量的使用2.1等待和信号同步2.2多任务等待和信号同步2.3信用跟踪同步 2.4单一共享资......