Board logo

标题: 共享内存(2) [打印本页]

作者: yuyang911220    时间: 2017-1-25 19:50     标题: 共享内存(2)

写入进程:
[cpp] view plain copy
    /**********************************************************
    *实验要求:   创建两个进程,通过共享内存进行通讯。
    *功能描述:   本程序申请了上一段程序相同的共享内存块,然后循环向共享中
    *           写数据,直至写入“end”。
    *日    期:   2010-9-17
    *作    者:   国嵌
    **********************************************************/  
    #include <unistd.h>  
    #include <stdlib.h>  
    #include <stdio.h>  
    #include <string.h>  
    #include <sys/types.h>  
    #include <sys/ipc.h>  
    #include <sys/shm.h>  
    #include "shm_com.h"  
      
    /*
     * 程序入口
     * */  
    int main(void)  
    {  
        int running=1;  
        void *shared_memory=(void *)0;  
        struct shared_use_st *shared_stuff;  
        char buffer[BUFSIZ];  
        int shmid;  
        /*创建共享内存*/  
        shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);  
        if(shmid==-1)  
        {  
            fprintf(stderr,"shmget failed\n");  
            exit(EXIT_FAILURE);  
        }  
      
        /*映射共享内存*/  
        shared_memory=shmat(shmid,(void *)0,0);  
        if(shared_memory==(void *)-1)  
        {  
            fprintf(stderr,"shmat failed\n");  
            exit(EXIT_FAILURE);  
        }  
        printf("Memory attached at %X\n",(int)shared_memory);  
      
        /*让结构体指针指向这块共享内存*/  
        shared_stuff=(struct shared_use_st *)shared_memory;  
        /*循环的向共享内存中写数据,直到写入的为“end”为止*/  
        while(running)  
        {  
            while(shared_stuff->written_by_you==1)  
            {  
                sleep(1);//等到读进程读完之后再写  
                printf("waiting for client...\n");  
            }  
            printf("Ener some text:");  
            fgets(buffer,BUFSIZ,stdin);  
            strncpy(shared_stuff->some_text,buffer,TEXT_SZ);  
            shared_stuff->written_by_you=1;  
            if(strncmp(buffer,"end",3)==0)  
            {  
                running=0;  //结束循环  
            }  
        }  
        /*删除共享内存*/  
        if(shmdt(shared_memory)==-1)  
        {  
            fprintf(stderr,"shmdt failed\n");  
            exit(EXIT_FAILURE);  
        }  
        exit(EXIT_SUCCESS);  
    }  
3 . 在一个终端中运行shm1,在另一个终端中运行shm2.当shm1运行起来之后,由于共享内存中没有数据可读,会处于等待状态
[root@localhost 2-4-4]# ./shm1
Memory attached at B7F9A000
/***阻塞***/
再向shm2运行的终端输入字符串
[root@localhost 2-4-4]# ./shm2
Memory attached at B7FD8000
Enter some text:Impossible is nothing
waiting for client。。。
waiting for client。。。
Enter some text:Anything is possible
waiting for client。。。
Ener some text:end
[root@localhost 2-4-4]#
shm1能够逐个从共享内存中巴他们读出来,知道双方晕倒字符串"end"后,两个程序都退出。
[root@localhost 2-4-4]# ./shm1
Memory attached at B7F9A000
You write:Impossible is nothing
You write:Anything is possible
You write:end
[root@localhost 2-4-4]#
以上运行过程中,红色表示在终端1中运行的结果,蓝色表示在终端2里面运行的结果。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0