代码示例_IPC_信号量灯

信号量_实现共享内存

 


1.头文件:

 1 #pragma once
 2 
 3 #include <stdio.h>
 4 #include <string.h>
 5 #include <stdlib.h>
 6 #include <sys/types.h>
 7 #include <sys/ipc.h>
 8 #include <sys/sem.h>
 9 #include <stdlib.h>
10 #include <sys/shm.h>
11 
12 union semun {
13     int              val;    /* Value for SETVAL */
14     struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
15     unsigned short  *array;  /* Array for GETALL, SETALL */
16     struct seminfo  *__buf;  /* Buffer for IPC_INFO
17                                 (Linux-specific) */
18 };
19 
20 
21 //extern int  creat_sem(key_t key, int size);
22 extern void get_sem(key_t key);
23 extern void sem_init(int semid,int value);
24 extern void sem_p(int semid, int num);
25 extern void sem_v(int semid, int num);
26 extern int delet_sem(int semid);

2.函数封装

 1 #include "sem.h"
 2 
 3 // 创建获取
 4 int  creat_sem(key_t key, int size)
 5 {
 6     int semid = semget(key, size,IPC_CREAT|0666);
 7         if(semid<0){
 8         perror("semget failed");
 9         exit(1);
10     }
11     return semid;
12 }
13 
14 
15 //初始化
16 void sem_init(int semid, int value)
17 {
18     union semun sem;
19     sem.val = value;
20 
21     if( semctl(semid,0,SETVAL,sem) <0 ){
22         perror("semctl init failed");
23         exit(1);
24     }
25 }
26 
27 
28 // P操作
29 void sem_p(int semid, int num)
30 {
31     struct sembuf buf = {num,-1,0};
32 
33     if( semop(semid,&buf,1) <0 ){
34         perror("semop failed");
35         exit(1);
36     }
37 }
38 
39 
40 // V操作
41 void sem_v(int semid, int num)
42 {
43     struct sembuf buf = {num,1,0};
44 
45     if( semop(semid,&buf,1) <0 ){
46         perror("semop failed");
47         exit(1);
48     }
49 }

3.  read

#include"sem.h"

int main(void)
{
    key_t key = ftok("/",0xb);  // 获取唯一键值
    if(key<0){
        perror("ftok failed");
        exit(1);
    }

    int shmid = shmget(key,1024,IPC_CREAT|0666); // 创建共享内存
    if(shmid<0){
        perror("shmget failed");
        exit(1);
    }

    int semid = creat_sem(key,1); // 创建信号量




 //    sem_init(shmid,0); // 初始信号量



    char* buf = (char*)shmat(shmid,NULL,0); // 挂载共享内存
    if(buf<0){
        perror("shmat failed");
        exit(1);
    }

    while(1){    //

        sem_p(semid,0);  // P操作

        fputs(buf,stdout);

        if(strncmp(buf,"quit",4)==0)
            break;
        sleep(1);
    }


    if( shmdt(buf) <0 ){        // 卸载共享内存
        perror("shmdt failed");
        exit(1);
    }



    shmctl(shmid,IPC_RMID,NULL); // 删除共享内存


    delet_sem(semid);   // 删除信号量

    return 0 ;
}

4.  write

 1 #include "sem.h"
 2 
 3    int main(void)
 4    {
 5 
 6    key_t key = ftok("/",0xb);  // 获取唯一键值
 7    if(key<0){
 8    perror("ftok");
 9    exit(1);
10    }
11 
12 
13 
14    int shmid = shmget(key,1024,IPC_CREAT|0666); // 创建共享内存
15    if(shmid<0){
16    perror("shmget failed");
17    exit(1);
18    }
19 
20    int semid =    creat_sem(key,1); // 创建信号量
21 
22 
23    sem_init(semid,0);          // 初始信号量
24 
25 
26    char* buf = (char *)shmat(shmid,NULL,0); // 挂载共享内存
27    if(buf<0){
28    perror("shmat failed");
29    exit(1);
30    }
31 
32 
33    while(1){            //
34 
35    fgets(buf,1024,stdin);
36 
37    sem_v(semid,0);    //  V操作:唤醒因P操作阻塞的进程
38 
39    if(strncmp(buf,"quit",4)==0)
40    break;
41    }
42 
43    if( shmdt(buf) <0 ){     // 卸载共享内存
44    perror("shmdt failed");
45    exit(1);
46    }
47 
48     shmctl(shmid,IPC_RMID,NULL); // 删除共享内存
49 
50     delet_sem(semid);    // 删除信号量
51 
52 return 0 ;
53 }

测试:


success !

<笔记>


1.注意头文件是否遗漏 !!

2.信号量初始化了一次

3.

猜你喜欢

转载自www.cnblogs.com/panda-w/p/11049402.html
今日推荐