引言 - ipc - shm 共享内存
本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制.
推荐先参看下面内容回顾一下 共享内存 linux api.
linux进程间的通信(C): 共享内存 http://blog.chinaunix.net/uid-26000296-id-3421346.html
上面文章可以简单看一下概念. 下面这篇文章好些, 可以细看加深共享内存api使用熟练度.
Linux共享内存(一) http://www.cnblogs.com/hicjiajia/archive/2012/05/17/2506632.html
那我们开始吧. 先看 初步编译文件 Makefile
CC = gcc DEBUG = -ggdb3 -Wall RUN = $(CC) $(DEBUG) -o $@ $^ all:shmsrv.out shmclt.out shmsrv.out:shmsrv.c $(RUN) shmclt.out:shmclt.c $(RUN) # 删除 make clean 操作 .PHONY:clean clean: rm -rf *.i *.s *.o *.out *~ core_*; ls -al
先看 共享内存 服务器端, 主要是写内容到共享内存中. shmsrv.c
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <sys/ipc.h> #include <sys/shm.h> // 控制台打印错误信息, fmt必须是双引号括起来的宏 #define CERR(fmt, ...) fprintf(stderr,"[%s:%s:%d][error %d:%s]" fmt " ", __FILE__, __func__, __LINE__, errno, strerror(errno),##__VA_ARGS__) // 控制台打印错误信息并退出, t同样fmt必须是 ""括起来的字符串常量 #define CERR_EXIT(fmt,...) CERR(fmt,##__VA_ARGS__),exit(EXIT_FAILURE) // 简单检测,意外就退出 #define IF_CHECK(code) if((code) < 0) CERR_EXIT(#code) // 共享内存key #define _INT_SHMKEY (0x12321) /* * 这里设置一个共享内存, 写入数据, 让别人来读. * 写入的数据内容来自用户输入. * 需要先启动 */ int main(int argc, char* argv[]) { int shmid, i, j; char* shm; // 检测参数输入 if(argc < 2) CERR_EXIT("uage: %s argv[1] [argv[.]].", argv[0]); /* * 0764 是0开头表示八进制数, * 7表示 当前进程具有读写执行权限, * 6表示 同会话组具有读写权限, 同组表示groupid 相同 * 4表示 其它表示具有读权限 */ IF_CHECK(shmid = shmget(_INT_SHMKEY, BUFSIZ+1, 0764|IPC_CREAT)); // 添加简单测试 printf("test stdio.h BUFSIZ = %d ", BUFSIZ); // 开始共享内存关联 shm = shmat(shmid, NULL, 0); // 这里写入数据 for(i=j=0; i<argc; ++i) { const char* ts = argv[i]; while(*ts) { shm[j++] = *ts++; if(j>=BUFSIZ) break; } if(j>=BUFSIZ) break; shm[j++] = ' '; } shm[j] = '