|
我写了一个使用共享内存的程序,在SCO和AIX下都运行正常,在linux(SUSE)下报段错误,代码和makefile文件如下,请各位帮忙分析以下,是否要在加什么设置!程序也再附件里了
/****************************************************
## NAME: logsrv.c
*****************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <errno.h>
#include <memory.h>
#include <unistd.h>
#include <setjmp.h>
#include <sys/types.h>
#include <sys/errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/fcntl.h>
#include <unistd.h>
#define IPCPERM 0xFFF
#define IPCGET 0
#define IPCCREAT ( IPCPERM | IPC_CREAT )
typedef struct {
long write_p ;
long read_p ;
long rest ;
int oper ;
char myfifo ;
} SHM ;
char *beg_p, *lp ;
SHM *shm ;
main ( argc, argv )
int argc ;
char *argv[] ;
{
// 建立共享内存
beg_p = (char *)creat_shm ( argv[0], sizeof(SHM) ) ;
beg_p = (char *)get_shm ( argv[0], sizeof(SHM) ) ;
if ( beg_p != NULL )
{
printf ( "initialize...\n" ) ;
memset ( (char *)beg_p, 0, sizeof(SHM) ) ;
shm=(SHM *)beg_p ;
shm->write_p = 1 ;
shm->read_p = 1 ;
shm->rest = 1 ;
shm->oper = 1 ;
exit (0 ) ;
}
printf ( "Create_shm fail!\n" ) ;
exit (-1 ) ;
}
/***********************************************************************
** NAME: get_shm_key()
** FUNC: 取信号量的KEY
** RET : KEY 值
** CALL: ftok ( keyfile )
***********************************************************************/
static key_t get_shm_key ( keyfile )
char *keyfile ; /* in: KEY 文件 */
{
if ( access ( keyfile, F_OK ) )
return ( (key_t )-1 ) ;
return ( ftok ( keyfile , 1 ) ) ;
}
/***********************************************************************
** NAME: creat_shm()
** FUNC: 创建SHM
** RET: NULL: 联该SHM指针fail
** other: 指向SHM指针
** CALL: get_shm_key(), shmget(),shmat()
***********************************************************************/
char *creat_shm ( shmfile, len )
char *shmfile ; /* in: KEY 文件 */
int len ; /* in: SHM 大小 */
{
int shmid ;
key_t key ;
char *shmptr ;
if ( ( key = get_shm_key ( shmfile) ) < 0 )
{
return ( NULL ) ;
}
if ( ( shmid = shmget ( key, len, IPCCREAT ) ) < 0 )
{
return ( NULL ) ;
}
if ( ( shmptr =(char *) shmat ( shmid, (char *)0, 0 ) ) == (char *)-1 )
{
return ( NULL ) ;
}
return ( shmptr ) ;
}
/***********************************************************************
** NAME: get_shm()
** FUNC: 取的SHM
** RET: NULL: 联该SHM指针fail
** other: 指向SHM指针
** CALL: get_shm_key(), shmget(),shmat()
***********************************************************************/
char *get_shm ( shmfile, len )
char *shmfile ; /* in: KEY 文件 */
int len ; /* in: SHM 大小 */
{
int shmid ;
key_t key ;
char *shmptr ;
if ( ( key = get_shm_key ( shmfile) ) < 0 )
{
return ( NULL ) ;
}
if ( ( shmid = shmget ( key, len , IPCGET ) ) < 0 )
{
return ( NULL ) ;
}
if ( ( shmptr =(char *) shmat ( shmid, (char *)0, 0 ) ) == NULL )
{
return ( NULL ) ;
}
return ( shmptr ) ;
}
/***********************************************************************
** NAME: attach_shm()
** FUNC: 释放SHN 联接
** RET: 0 : succ
** -1 : fail
** CALL: shmdt ()
***********************************************************************/
int attach_shm ( shmptr )
char *shmptr; /* in: SHM 指针 */
{
if ( shmdt ( shmptr ) < 0 )
{
return ( -1 ) ;
}
return ( 0 ) ;
}
/***********************************************************************
** NAME: remove_shm()
** FUNC: 删除共享内存
** RET: 0:succ
** -1: fail
** CALL: get_shm_key(), shmget(), shmctl()
**********************************************************************/
int remove_shm ( shmfile )
char *shmfile ;
{
key_t key ;
int shmid ;
if ( ( key = get_shm_key ( shmfile) ) < 0 )
{
return ( -1 ) ;
}
if ( ( shmid = shmget ( key, 2, IPCGET ) ) < 0 )
{
return ( -1 ) ;
}
if ( shmctl ( shmid, IPC_RMID, NULL ) < 0 )
{
return ( -1 ) ;
}
return ( 0 ) ;
}
makefile文件如下:
ESQL=esql
CC=gcc
BINDIR=../bin/
INCLDIR=../incl ./
LIBDIR=../lib
#LIB= -lftp -lc -lm -lsocket -lld -lx
#LIB= -ansi -lc -lm
LIB= -O2
FLAGS=-c -O -s -I${INCLDIR}
.SUFFIXES: .o .c .ec
.ec.o:
$(ESQL) ${FLAGS} $<
@rm -f $*.c
.c.o:
${CC} ${FLAGS} $*.c
all: testshm
testshm:testshm.o
${CC} -o ${BINDIR}$@ $? ${LIB}
#rm testshm.o |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|