代碼示例_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.函數封裝ui

 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.  readspa

#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.  writecode

 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 }

 

 

 

測試:blog


 

 

 

success !進程

 

<筆記>ip


1.注意頭文件是否遺漏 !!內存

2.信號量初始化了一次ci

3.

相關文章
相關標籤/搜索