信号量集和共享内存段共用

待补齐

 

A(联合体应主动补齐)

查看代码

/*************************************************
*   filename:shm_semA.c
*   function:   进程A创建一个信号量集,要求信号量集中只有一个信号量,
*               队信号量集中的信号进行设置,要求集合中的信号量初值为1,
*               再创建一个共性内存段存放int型的data,
*               再设计进程B和进程C,要求进程B和C,使用进程A创建的信号量集中的信号量进行互斥的访问
*               B进程使data+1,C进程打印data的值
*   date:2025.6.10
*   note:
*
*   CopyRight (c)  2024-2025 l550036303@163.com All right reserved
************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/types.h>

union semun {
               int              val;    /* Value for SETVAL */
               struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
               unsigned short  *array;  /* Array for GETALL, SETALL */
               struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
           };

void main(){
    //创建一个共享内存
    int shm_id = shmget(ftok(".",0x11),4,IPC_CREAT|0664|IPC_EXCL);
    if(shm_id == -1){
        fprintf(stderr,"shmget error,errno:%d,%s",errno,strerror(errno));
        shm_id = shmget(ftok(".",0x11),4,0664);

    }

    int * addr =  (int *)shmat(shm_id,NULL,0);
    if(addr == (void *)-1){
        fprintf(stderr,"shmat error,errno:%d,%s",errno,strerror(errno));
    }

    *addr=0;

    shmdt(addr);

    //创建共享信号量集
    int sem_id = semget(ftok(".",0x12),1,IPC_CREAT|0644);
        if(sem_id == -1){
        fprintf(stderr,"semget error,errno:%d,%s",errno,strerror(errno));
        
    }
    union semun sem_arg;
    sem_arg.val=1;
    if( -1 == semctl(sem_id,0,SETVAL,sem_arg))
    {
        fprintf(stderr,"semget error,errno:%d,%s",errno,strerror(errno));
    }


}

B

查看代码
 /*************************************************
*   filename:shm_semB.c
*   function:   进程A创建一个信号量集,要求信号量集中只有一个信号量,
*               队信号量集中的信号进行设置,要求集合中的信号量初值为1,
*               再创建一个共性内存段存放int型的data,
*               再设计进程B和进程C,要求进程B和C,使用进程A创建的信号量集中的信号量进行互斥的访问
*               B进程使data+1,C进程打印data的值
*   date:2025.6.10
*   note:
*
*   CopyRight (c)  2024-2025 l550036303@163.com All right reserved
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/types.h>

void main(){
    //1.打开共享内存段
    int shm_id = shmget(ftok(".",0x11),4,0644);
    if(shm_id == -1){
        fprintf(stderr,"shmget error,errno:%d,%s",errno,strerror(errno));
    }
    int * addr = shmat(shm_id,NULL,0);
    if(addr == (void *)-1){
        fprintf(stderr,"shmat error,errno:%d,%s",errno,strerror(errno));
    }
    //打开信号量集
    int sem_id = semget(ftok(".",0x12),0,0664);
    struct sembuf sem_p;
    sem_p.sem_num=0;
    sem_p.sem_op=-1;
    sem_p.sem_flg=0;
    struct sembuf sem_v;
    sem_v.sem_num=0;
    sem_v.sem_op=1;
    sem_v.sem_flg=0;

    while(1){
        //p操作
        semop(sem_id,&sem_p,1);
        printf("******************进行data+1***********************\n");
        *addr += 1;
        //v操作
        semop(sem_id,&sem_v,1);
        sleep(3);
    }
}

C

查看代码
 /*************************************************
*   filename:shm_semC.c
*   function:   进程A创建一个信号量集,要求信号量集中只有一个信号量,
*               队信号量集中的信号进行设置,要求集合中的信号量初值为1,
*               再创建一个共性内存段存放int型的data,
*               再设计进程B和进程C,要求进程B和C,使用进程A创建的信号量集中的信号量进行互斥的访问
*               B进程使data+1,C进程打印data的值
*   date:2025.6.10
*   note:
*
*   CopyRight (c)  2024-2025 l550036303@163.com All right reserved
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/types.h>
void main(){
    //1.打开共享内存段
    int shm_id = shmget(ftok(".",0x11),4,0644);
        if(shm_id == -1){
        fprintf(stderr,"shmget error,errno:%d,%s",errno,strerror(errno));
    }
    int *addr = shmat(shm_id,NULL,0);
        if(addr == (void *)-1){
        fprintf(stderr,"shmat error,errno:%d,%s",errno,strerror(errno));
        }
    //2.连接信号量集
    int sem_id = semget(ftok(".",0x12),1,0644);
    struct sembuf sem_p;
    sem_p.sem_num=0;
    sem_p.sem_op=-1;
    sem_p.sem_flg=0;
    struct sembuf sem_v;
    sem_v.sem_num=0;
    sem_v.sem_op=1;
    sem_v.sem_flg=0;

    while(1){
        semop(sem_id,&sem_p,1);
        printf("**********************************************\n");
        printf("data = %d\n",*addr);
        printf("**********************************************\n");
        semop(sem_id,&sem_v,1);
        sleep(3);
    }
}
posted @ 2025-06-10 16:51  记得要好好吃饭  阅读(7)  评论(0)    收藏  举报