QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1075|回复: 2

紧急求助:有一个段错误情况

[复制链接]
发表于 2005-10-30 14:31:02 | 显示全部楼层 |阅读模式
我写了一个使用共享内存的程序,在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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-10-30 23:21:28 | 显示全部楼层
自己用gdb跟踪一下啊
回复

使用道具 举报

 楼主| 发表于 2005-11-2 16:03:10 | 显示全部楼层
错误好定位,执行该句报错,但是为什么导致该错误?
memset ( (char *)beg_p, 0, sizeof(SHM) ) ;
不要说些空话,什么“gdb”以下,“跟踪以下”。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 04:21 , Processed in 0.039874 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表