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

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

时间:2024-06-11 13:57:19浏览次数:29  
标签: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/18241914

相关文章

  • 浅析嵌入式实时系统中信号量的概念
    目录概述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单一共享资......
  • 情景题之小明的Linux实习之旅:linux实战练习1(上)【基础命令,权限修改,日志查询,进程管理...
    小明的Linux实习之旅:基础指令练习情景练习题背景介绍场景1:初识Linux,创建目录和文件场景2:权限管理,小明的权限困惑场景3:打包与解压,小明的备份操作场景4:使用Grep,小明的搜索技能场景5:系统服务管理,小明的首次接触场景6:进程管理,小明的多任务处理场景7:定时任务与系统状态场景8:d......
  • MySQL数据库的基础:逻辑集合数据库与表的基础操作
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • IO进程线程(十一)进程间通信 消息队列
    文章目录一、IPC(Inter-ProcessCommunication)进程间通信相关命令:(一)ipcs---查看IPC对象(二)获取IPC键值(三)删除IPC对象的命令(四)获取IPC键值的函数1.函数定义2.使用示例二、消息队列(一)特点(二)相关API1.创建或获取一个消息队列2.向消息队列中写消息3.在消息队列中......
  • IO进程线程(十二)进程间通信 共享内存 信号灯集
    文章目录一、共享内存sharedmemory(shm)(一)特点(二)相关API1.创建共享内存2.映射共享内存到当前的进程空间3.取消地址映射4.共享内存控制(三)使用示例(四)属性二、信号灯集---控制进程间同步(一)特点(二)相关API1.创建一个信号灯集2.信号灯集控制函数3.信号灯集的操作函......
  • linux内核空间进程为什么无论如何切换,内核地址空间转换到物理地址的关系是永远不变的?
    在Linux内核中,无论如何切换进程,内核地址空间转换到物理地址的关系是永远不变的,主要原因是内核地址空间在所有进程中是共享的。这种设计有几个关键点:1.内核地址空间共享在Linux操作系统中,每个进程都有自己独立的用户空间地址范围,但内核空间地址范围对所有进程是共享的。具体来说......
  • 【Python教程】4-字符串、列表、字典、元组与集合操作
    在整理自己的笔记的时候发现了当年学习python时候整理的笔记,稍微整理一下,分享出来,方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术,最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新,然后更新深度学习的一些框架,一些代码,从CV到NLP都会有相应......
  • 进程间通信
    进程间通信1.什么是通信数据传输:一个进程需要将自己的数据传输给另一个进程资源共享:多个进程同时共享一个资源进程事件:一个进程向一组(或一个)进程通知某一事件,如:子进程结束要通知父进程来回收资源进程控制:有些进程需要知道另一个进程的状态,控制拦截另一个进程陷入异常等,如:gd......
  • Java-11_集合
    文章目录1.集合概述1.1数组的特点与弊端1.2Java集合框架体系2.Collection接口及方法2.1添加2.2判断2.3删除2.4其它3.Iterator(迭代器)接口3.1Iterator接口3.2迭代器的执行原理3.3foreach循环4.Collection子接口:List4.1List接口特点4.2List接口方法4.3......
  • 第1讲:进程和线程
    扫盲课。对Linux系统下,进程和线程的基本概念和对比进行阐述。一、进程进程是处于执行期的程序及相关资源的总称。操作系统为进程提供两种虚拟机制:虚拟处理器&虚拟内存,目的是让进程有一种假象:“独享处理器和整个内存空间”。关于进程描述符structtask_struct放在后续内容......