菊哥 發表於 2025-5-8 17:11:00

信号量结合共享内存练习

<p>设计程序,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。进程B对变量进行+1操作,写入共享内存,进程C读取共享内存的数据,并输出。</p>
<pre><code>/********************************************************************************
*
*
* 使用信号量对共享内存进行互斥访问
* author:jindouliu2024@163.com
* date:2025.5.8
* Copyright (c)2024-2025   jindouliu2024@163.com   All right Reserved
* ********************************************************************************/
</code></pre>
<pre><code>//进程A
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/ipc.h&gt;
#include &lt;sys/shm.h&gt;
#include &lt;sys/sem.h&gt;
#include &lt;unistd.h&gt;

union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};
int main()
{
        //申请IPC对象的键值
        int key = ftok(".",3);
        //创建信号量集
        int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
        if(sem_id == -1){
                printf("semget error\n");
                //如果已经创建,则直接打开
                sem_id = semget(key,1,0644);
        }
        //设置资源数量
        union semun sem_union;
    sem_union.val = 1;
    semctl(sem_id, 0, SETVAL, sem_union);
    return 0;
}
</code></pre>
<pre><code>//进程B
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/ipc.h&gt;
#include &lt;sys/shm.h&gt;
#include &lt;sys/sem.h&gt;
#include &lt;unistd.h&gt;
int i = 0;
char *shm_map;
union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};
struct sembuf p_op = {0, -1, SEM_UNDO};
struct sembuf v_op = {0, 1, SEM_UNDO};
int main()
{
        //设置键值
        key_t key1 = ftok(".",2);
        //创建一块共享内存空间
        int shm_id = shmget(key1,256,IPC_CREAT|IPC_EXCL|0644);
        if(shm_id == -1){
                printf("shmget error\n");
                shm_id = shmget(key1,256,0644);
               
        }
       
        //连接映射空间,并写入数据
        shm_map = (char *)shmat(shm_id,NULL,0);

        //申请IPC对象的键值
        key_t key = ftok(".",3);
        //创建信号量集
        int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
        if(sem_id == -1){
                printf("semget error\n");
                //如果已经创建,则直接打开
                sem_id = semget(key,1,0644);
        }
        while(1){
                //申请资源
                semop(sem_id,&amp;p_op,-1);
                i++;
                //向内存写入数据
                sprintf(shm_map,"data = %d\n",i);
                //归还资源
                semop(sem_id,&amp;v_op,1);
                sleep(2);
        }
       
    return 0;
}
</code></pre>
<pre><code>//进程C
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/ipc.h&gt;
#include &lt;sys/shm.h&gt;
#include &lt;sys/sem.h&gt;
#include &lt;unistd.h&gt;
char *shm_map;
union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};
struct sembuf p_op = {0, -1, SEM_UNDO};
struct sembuf v_op = {0, 1, SEM_UNDO};
int main()
{
        //设置键值
        key_t key1 = ftok(".",2);
        //创建一块共享内存空间
        int shm_id = shmget(key1,256,IPC_CREAT|IPC_EXCL|0644);
        if(shm_id == -1){
                printf("shmget error\n");
                shm_id = shmget(key1,256,0644);
               
        }
       
        //连接映射空间,并写入数据
        shm_map = (char *)shmat(shm_id,NULL,0);

        //申请IPC对象的键值
        key_t key = ftok(".",3);
        //创建信号量集
        int sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0644);
        if(sem_id == -1){
                printf("semget error\n");
                //如果已经创建,则直接打开
                sem_id = semget(key,1,0644);
        }
        while(1){
                //申请资源
                semop(sem_id,&amp;p_op,-1);
               
                //向内存读取数据
               
                printf("%s\n",shm_map);
                //归还资源
                semop(sem_id,&amp;v_op,1);
                sleep(2);
        }
       
    return 0;
}
</code></pre><br><br>
来源:https://www.cnblogs.com/lradian/p/18866695
頁: [1]
查看完整版本: 信号量结合共享内存练习