IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    linux共享内存应用范例

    reille发表于 2016-01-10 00:06:51
    love 0

    共享内存是linux进程间通信的一种方式,实现多进程共享变量。应用共享内存时,主要涉及shmget、shmat、shmdt、shmctl四个函数。

    此外,可通过ipcs -m来查看linux共享内存使用情况。

    下面展示一个本人编写的一应用实例。

    /**
     * \File	test_shm.c
     *
     * COPYRIGHT (C) 2016 http://velep.com/
     *
     * \brief	linux共享内存测试程序
     * 			使用共享内存,实现多进程共享变量
     * 
     * \version: Ver1.0
     * \Date   : 2016.01.10
     * \Decrip : 原始版本
     */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/shm.h>
    #include <sys/stat.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    
    // 基本类型定义
    #define true        1
    #define false       0
    
    typedef unsigned char        bool;
    typedef unsigned char        byte;
    typedef unsigned char        __u8;
    typedef unsigned int         __u32;
    
    // 共享内存数据结构
    typedef struct struct_context
    {
        __u8            data;
    } context_t;
    
    // 全局变量定义
    static bool  run = true;
    context_t *g_pcontext = NULL;
    
    // ----------------------------------------------------------------------------
    
    void delay_ms(const __u32 ms)
    {
        struct timespec tv;
    
        tv.tv_sec = ms / 1000;
        tv.tv_nsec = (long)(ms % 1000) * 1000000;
    
        nanosleep(&tv, NULL);
    }
    
    // 信号处理
    void sig_handler(int signo) 
    { 
        switch(signo)
        {
        case SIGINT:
            run = false;
            printf(".Exit\n");
            break;
    
        default: break;
        }
    }
    
    // 安装信号
    void install_sig(void) 
    { 
        signal(SIGINT, sig_handler);
    }
    
    int main(int argc, char **argv)
    {
    	pid_t pid = -1;
    	int shmid;// id for shared memory
    	int status = 0;
    	
    	// 创建一个新的共享内存对象
    	shmid = shmget(IPC_PRIVATE, sizeof(context_t), S_IRUSR | S_IWUSR);
    	// 映射共享内存
        g_pcontext = (context_t *)shmat(shmid, NULL, 0);
        if (g_pcontext == NULL)
        {
            printf("\n\t创建共享内存失败\n\n");
            return  -1;
        }
        memset(g_pcontext, 0x00, sizeof(*g_pcontext));
    	
    	printf("\n创建共享内存: shmid [%d], size [%d]\n", 
    			shmid, sizeof(context_t));
    	
    	// 显示共享内存的情况 
    	system("ipcs -m");		
    
        run = true;
    	
    	pid = fork();
        if (pid == -1) 
        { 
            printf("\n\t创建进程失败\n\n");
            run = false;
        }
        else if (pid == 0) // 子进程
        {
            while (run)
            {
    			if (g_pcontext->data >= 3)
    			{
    				delay_ms(1000);
    				g_pcontext->data++;
    				printf("子进程,data [%u]\n", g_pcontext->data);		
    				if (g_pcontext->data >= 6)
    				{
    					break;
    				}
    				continue;
    			}
    			delay_ms(10);
    		}		
    	}
    	else // 父进程
        {
            install_sig();
    		
            while (run)
            {			
    			g_pcontext->data++;
    			printf("父进程,data [%u]\n", g_pcontext->data);
    			if (g_pcontext->data >= 3)
    			{
    				break;
    			}
    			
    			delay_ms(1000);
    		}			
    		
    		// 等待子进程退出
            while(((pid = wait(&status)) == -1) && (errno == EINTR))
            {
                delay_ms(10);
            }
    	}
    	
        shmdt(g_pcontext);// 解除共享内存映射
        shmctl(shmid, IPC_RMID, NULL);// 释放共享内存
    	
    	// 显示共享内存的情况 
    	system("ipcs -m");	
    	
    	return	0;
    }
    您可能也喜欢:

    Linux平台下如何检测、调试C/C++程序内存泄漏?

    嵌入式LINUX的开发经验与教训随笔

    使用eclipse SDK开发嵌入式linux应用程序——eclipse的C/C++开发环境安装与配置

    再说eCos内存布局文件(下)

    linux socket can程序cantool
    无觅
    » 本文地址: http://velep.com/archives/1211.html
    » 文章出处: reille博客—http://velep.com , 如果没有特别声明,文章均为reille博客原创作品
    » 郑重声明: 原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)
    分享到:
    推荐阅读相关文章:
    • LINUX socket can的bit-timing not yet defined错误
    • Linux CAN编程详解
    • linux socket can程序cantool
    • TCP Server处理多Client请求的方法—非阻塞accept与select
    • 联想E430C和WINDOW 7
    • undefined reference to `_WinMain@16’问题
    • linux backtrace()详细使用说明,分析Segmentation fault
    • 一个PTHREAD_STACK_MIN宏定义引出的头文件包含问题


沪ICP备19023445号-2号
友情链接