Linux 进程间通信(IPC)之三 --- 共享内存

场景:

    两个进程,A进程创建共享内存并读取数据;B进程连接共享内存写入数据。输入 end 结束进程。

应用实例:

头文件:shm_com.h

 

01.#include <unistd.h>  
02.#include <stdlib.h>  
03.#include <stdio.h>  
04.#include <sys/types.h>  
05.#include <sys/ipc.h>  
06.#include <sys/shm.h>  
07.  
08.#define TEXT_SZ 2048  
09.  
10.struct  shared_use_st{  
11.    int written_by_you;  
12.    char    some_text[TEXT_SZ];  
13.};  


消费者程序:shm_customer.h消费者程序:shm_customer.h消费者程序:shm_customer.h

 

01.#include "shm_com.h"  
02.  
03.int main(int argc,char **argv)  
04.{  
05.    int running = 1;  
06.    void *shared_memory = (void *)0;  
07.    struct  shared_use_st *shared_stuff;  
08.    int shmid;  
09.  
10.    srand((unsigned int)getpid());  
11.  
12.    shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);  
13.    if(shmid == -1){  
14.        fprintf(stderr,"shmget failed\n");  
15.        exit(-1);  
16.    }  
17.      
18.    shared_memory = shmat(shmid,(void *)0,0);  
19.    if(shared_memory == (void *)-1){  
20.        fprintf(stderr,"shmat failed\n");  
21.        exit(-1);  
22.    }  
23.  
24.    shared_stuff = (struct shared_use_st *)shared_memory;  
25.    shared_stuff->written_by_you = 0;  
26.    while(running){  
27.        if(shared_stuff->written_by_you){  
28.            printf("You wrote: %s",shared_stuff->some_text);  
29.            sleep(rand()%4);  
30.            shared_stuff->written_by_you = 0;  
31.            if(strncmp(shared_stuff->some_text,"end",3) == 0){  
32.                running = 0;      
33.            }  
34.        }  
35.    }  
36.  
37.    if(shmdt(shared_memory) == -1){  
38.        fprintf(stderr,"shmdt failed!\n");  
39.        exit(-1);  
40.    }  
41.  
42.    if(shmctl(shmid,IPC_RMID,0) == -1){  
43.        fprintf(stderr,"shmctl(IPC_RMID) failed!\n");  
44.        exit(-1);  
45.    }  
46.  
47.    exit(0);  
48.}  

 

生产者程序:shm_producer.c

01.#include "shm_com.h"  
02.  
03.int main(int argc,char **argv)  
04.{  
05.    int running = 1;  
06.    void *shared_memory = (void *)0;  
07.    struct  shared_use_st *shared_stuff;  
08.    char    buffer[TEXT_SZ];  
09.    int shmid;  
10.  
11.    shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);  
12.    if(shmid == -1){  
13.        fprintf(stderr,"Shmget failed!\n");  
14.        exit(-1);  
15.    }  
16.  
17.    shared_memory = shmat(shmid,(void *)0,0);  
18.    if(shared_memory == (void *)-1){  
19.        fprintf(stderr,"Shmat failed!\n");  
20.        exit(-1);  
21.    }  
22.      
23.    printf("Memory attached at %X\n",(int)shared_memory);  
24.  
25.    shared_stuff = (struct shared_use_st *)shared_memory;  
26.    while(running){  
27.        while(shared_stuff->written_by_you == 1){  
28.            sleep(1);  
29.            printf("Waiting for client...\n");  
30.        }  
31.        printf("Enter some text: ");  
32.        fgets(buffer,TEXT_SZ,stdin);  
33.  
34.        strncpy(shared_stuff->some_text,buffer,TEXT_SZ);  
35.        shared_stuff->written_by_you = 1;  
36.  
37.        if(strncmp(buffer,"end",3) == 0){  
38.            running = 0;  
39.        }  
40.    }  
41.  
42.    if(shmdt(shared_memory) == -1){  
43.        fprintf(stderr,"Shmdt failed\n");  
44.        exit(-1);  
45.    }  
46.  
47.    exit(0);  
48.}  


 


生产者程序:shm_producer.c生产者程序:shm_producer.c生产者程序:shm_producer.c生产者程序:shm_producer.c生产者程序:shm_producer.c

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值