- 论坛徽章:
- 0
|
我把代码贴以下吧
-
- #include "ipc.h"
- #define MAXRESENDTIME 50
- static char CHECKMESSAGE[31];
- static long COREID=0;
- static int SHMID=0;
- static int SEMID=0;
- typedef struct Counter
- {
- long value;
- }COUNTER;
- /*******************************************************************************\
- * 函 数 名 : IPC_INIT
- * 函数功能 : 初始化ipc,只有在调用V_的发送的时候才在程序的开始调用此函数
- * 编 程 者 : 高振华
- * 编写日期 : 2005.09.12
- * 输入参数 :
- : errmsg:失败原因
- :
- * 输出参数 :
- : 如果失败则返回负值,并在errmsg里指明失败原因
- * 修 改 者 :
- * 修改内容 :
- * 修改日期 :
- :
- :
- \*********************************************************************************/
- int IPC_INIT(char *errmsg)
- {
- int ret=0;
- COUNTER *SHMCOREID=NULL;
- char CurrPath[255];
- char ProcName[100];
- key_t IPC_KEY;
- int exist_flag=0;
-
- if(errmsg==NULL)
- return -1;
- if(SHMID>;0&&SEMID>;0)
- {
- sprintf(errmsg,"%s","已初始化!");
- return 0;
- }
-
-
- memset(CurrPath,0,sizeof(CurrPath));
- if(getcwd(CurrPath,254)==NULL)
- {
- sprintf(errmsg,"%s","取得当前工作路径失败");
- return -1;
- }
- if(getCurrentProcName(ProcName)<0)
- {
- sprintf(errmsg,"%s","获取当前程序名称失败");
- return -1;
- }
- /*sprintf(ProcName,"%s",getCurrentProcName());*/
- printf("=========ProcName=========[%s]\n",ProcName);
- if(CurrPath[strlen(CurrPath)-1]!='/')
- {
- strcat(CurrPath,"/");
- }
- sprintf(CurrPath,"%s%s",CurrPath,ProcName);
-
- printf("CurrPath===[%s]\n",CurrPath);
- IPC_KEY=ftok(CurrPath,128);
- if(IPC_KEY==-1)
- {
- sprintf(errmsg,"%s","ftok转换失败");
- return -1;
- }
-
- SHMID=shmget(IPC_KEY,sizeof(COUNTER)*10000,IPC_CREAT|0666|IPC_EXCL);
- if(SHMID<0)
- {
- if(errno==EEXIST)
- {
- printf("-----IPC已经被初始化------ \n");
- exist_flag=1;
- }
- else
- {
- perror("Creat Shm error!\n");
- sprintf(errmsg,"%s","Creat Shm error!");
- return -1;
- }
- }
-
- /*取得共享内存*/
- if(!exist_flag)
- SHMID=shmget(IPC_KEY,sizeof(COUNTER)*10000,IPC_CREAT|0666);
- else
- SHMID=shmget(IPC_KEY,sizeof(COUNTER)*10000,0666);
- if(SHMID<0)
- {
- perror("Creat Shm error!\n");
- sprintf(errmsg,"%s","创建共享内存失败");
- return -1;
- }
-
- SEMID=creat_semaphore(IPC_KEY,1);
- if(SEMID<0)
- {
- sprintf(errmsg,"%s","创建信号量失败");
- return -1;
- }
-
- if(!exist_flag)
- {
- ret=init_semaphore(SEMID,0,1);
- if(ret<0)
- {
- sprintf(errmsg,"%s","初始化信号量失败");
- return -1;
- }
- }
- /*初始化共享内存*/
- if(!exist_flag)
- {
- SHMCOREID=(COUNTER *)shmat(SHMID,0,0);
- if(SHMCOREID==NULL)
- {
- sprintf(errmsg,"%s","初始化共享内存失败");
- return -1;
- }
- locksem(SEMID,0);
- memset(SHMCOREID,0,sizeof(COUNTER)*10000);
- (SHMCOREID+9999)->;value=0;
- unlocksem(SEMID, 0);
- shmdt(SHMCOREID);
- }
-
- sprintf(errmsg,"%s","初始化成功");
- return 0;
- }
-
复制代码
上面是库函数的一部分,库的makefile
AR = ar
ARFLAGS = -rv
CC = cc -c -g +DA2.0w
#--------------------------------------------
libclient_SRCS=ipc.c
libclient_OBJS=ipc.o
libclient_TARGET = libIPC.a
#------------------------------------------
all : $(libclient_TARGET)
rm *.o
#------------------------------------------
$(libclient_TARGET) : $(libclient_OBJS)
rm -f $(libclient_TARGET)
$(AR) $(ARFLAGS) $(libclient_TARGET) $(libclient_OBJS)
#-------------------------------------------------------------------------
下面是调用库函数的main函数
- #include "tc.h"
- int main()
- {
- int ret=0;
- char desc[200];
-
- memset(desc,0,sizeof(desc));
-
- ret=IPC_INIT(desc);
- if(ret<0)
- {
- printf("IPC_INIT error!-->;%s\n",desc);
- return -1;
- }
- printf("IPC_INIT success!-->;%s\n",desc);
- return 0;
- }
复制代码
makefile :
PROG=t
CC=cc +DA2.0w
objs=main.o
all (PROG)
$(PROG) (objs)
$(CC) -g $(objs) -L /interlog/ipc -lIPC -o t
rm *.o
test.o:main.c
$(CC) -c -I$(HOME)/include main.c
编译成32位的代码运行都没问题,但只要编译成64位的,共享内存的地址可以取到,可是一访问就会core,再编译成32位的还是没问题,环境是hp-ux 11.11 |
|