当前位置:  技术问答>linux和unix

怎样在共享内存里面建立二叉树,非常着急在线等,拜托各位高手了

    来源: 互联网  发布时间:2015-09-21

    本文导语:  redhat linux 9.0、gcc 代码如下: #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include "../hour/val.h" #define KEYKEY 539 #define SIZE (150 * 1024 * 1024) int shmid; long read...

redhat linux 9.0、gcc


代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "../hour/val.h"


#define KEYKEY 539
#define SIZE (150 * 1024 * 1024)

int shmid;
long read_count=0;


struct Keylist
{
long ID;
char Key[256];

struct Keylist *rptr;
struct Keylist *lptr;
};
typedef struct Keylist Keynode;
typedef Keynode *Keylink;
Keylink Keyroot;
Keylink keyptr_temp;



// 关键字开始
int main(int argc, char *argv[])
{
FILE *fp;

char *def_host_name=NULL,query[1024];
char DB[50];
char KeyLine[1024];
char KeyLineTemp[1024];
char *KeyLineStr;
char KeyLinePan[]="`";
char KeyStr[1024];
char path[255];
char cmdstr[255]="";

long ID=0;

Keylink Keyinsert();



Keyroot=NULL;
shmid=shmget(KEYKEY,SIZE,IPC_CREAT|0600);
Keyroot=(Keylink)shmat(shmid,NULL,SHM_RND);
Key_count_display_shm(Keyroot);
shmdt(Keyroot);



if(read_count == 1)
{
// 如果内容已经被读入共享内存则不做,否则就做下面的过程

printf("tread KEYn");

Keyroot=NULL;

shmid=shmget(KEYKEY,SIZE,IPC_CREAT|0600);


sprintf(cmdstr,"mkdir -p %s%s%s;chmod 777 %s%s%s -R",textdb_path2,argv[2],textdb_path3,textdb_path2,argv[2],textdb_path3);
//printf("%sn",cmdstr);exit(0);
system(cmdstr);

sprintf(path,"%s%s%sKeyword",textdb_path2,argv[2],textdb_path3);
//printf("%sn",path);exit(0);

//sprintf(path,"%s%sKeyword",textdb_path2,argv[2]);
if((fp=fopen(path,"r"))==NULL)
{
printf("KeyList file not found!n");
perror("");
//exit(0);
}else
{
while(fgets(KeyLine,1024,fp))
{
//printf("%s",KeyLine);
KeyLine[strlen(KeyLine)-1]='';
strcpy(KeyLineTemp,KeyLine);
KeyLineStr=KeyLineTemp;

ID=atol(strsep(&KeyLineStr,KeyLinePan));
strcpy(KeyStr,strsep(&KeyLineStr,KeyLinePan));

Keysearch(Keyroot,KeyStr,ID,0);
}
}

//Key_display_shm(Keyroot);

shmdt(Keyroot);
}else
{
printf(" KEY already inputn");
}
}



int Keysearch(Keylink ptr,char KeyLine[1024],long ID,int i)
{
int found=0;

Keylink fptr;
Keylink Keyinsert();

if(ptr==NULL)
{
//ptr=root=(llink)malloc(sizeof(node));
ptr=Keyroot=keyptr_temp=(Keylink)shmat(shmid,NULL,SHM_RND);
ptr->rptr=NULL;
ptr->lptr=NULL;
//printf("#%i#n",sizeof(node));exit(0);

sprintf((ptr->Key),"%s",KeyLine);
ptr->ID=ID;
}else
{
while((found!=1) && (ptr!=NULL))
{
if(!strcmp(ptr->Key,KeyLine))
{
//printf("found %sn",LineInfo->Cookie);
//tupdate(ptr,LineInfo,URLID);
found=1;
return 0;
}else
{
if(strcmp(ptr->Key,KeyLine)>0)
{
fptr=ptr;
ptr=ptr->lptr;
}else
{
fptr=ptr;
ptr=ptr->rptr;
}
}
}

if(found==0)
{
Keyinsert(fptr,KeyLine,ID,i);
}
}
return 1;
}
Keylink Keyinsert(Keylink fptr,char KeyLine[1024],long ID,int i)
{
Keylink nptr;

nptr=(keyptr_temp+1);
keyptr_temp=nptr;
nptr->rptr=NULL;
nptr->lptr=NULL;

sprintf((nptr->Key),"%s",KeyLine);
nptr->ID=ID;

if(strcmp(fptr->Key,KeyLine)>0)
{
fptr->lptr=nptr;
}else
{
fptr->rptr=nptr;
}

return nptr;
}

Key_display_shm(Keylink ptr)
{
if(ptr!=NULL)
{
printf("%ld`%sn",ptr->ID,ptr->Key);

Key_display_shm(ptr->lptr);
Key_display_shm(ptr->rptr);
}
}

Key_count_display_shm(Keylink ptr)
{
if(ptr!=NULL)
{
//printf("%ld`%sn",ptr->ID,ptr->Key);
read_count++;

Key_count_display_shm(ptr->lptr);
Key_count_display_shm(ptr->rptr);
}
}
// 关键字结束

|
建议你用:  cat  /proc/sys/kernel/shmmax 看一下共享内存的大小,然在在程序里计算一下节点数量和节点总容量,是不是超出共享内存大小了。

|
注意数据的大小不能超过共巷内存的大小,共享内存大小是有上限的,所一超大文本可能会大于分配到的共享内存的大小

|
kernel 2.4 缺省最大shm 32M, 不知道你sizeof(Keylink)是多大,如果写多了会crash. 你的程序也没有检查。

    
 
 

您可能感兴趣的文章:

  • 用samba共享其它机子访问Linux共享时,机子可以进入,但要打开共享文件夹时提示“无法访问...找不到网络名。”这是什么原因呢? iis7站长之家
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 程序需要共享内存相当大,但是系统的内存有限
  • 在linux下能不能创建一个堆,然后给堆指定一块共享内存,然后各个程序用此堆来new对象来共享?
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • 不同用户user之间如何访问共享内存?
  • Unix/linux下如何监测共享内存的使用情况
  • 共享内存问题,高手们请进!!!
  • 判断共享内存中是否有数据
  • 【求助】linux下什么是共享内存,怎么查看。
  • linux下共享内存的覆盖或清空
  • 进程同时访问两个大共享内存,会失败?
  • 共享内存和信号灯同步问题
  • 为什么不将数据直接写入共享内存?
  • aix 的开个共享内存的问题
  • linux下共享内存 函数shmat()的使用!
  • 请详细介绍一下共享内存机制~~
  • 初学者关于共享内存的几个问题-->
  • 文件描述符的限制?(共享内存)
  • 在语言中,什么是共享内存,怎样使用,举例?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 搭建虚拟机用的VirtualBox 怎样在主机XP虚拟机ubuntu之间建立共享
  • 关于共享内存的建立和返回的大小
  • NFS共享作业时, 在客户端只可以看到服务器端的共享目录,而看不到共享目录下的内容.?
  • 如何共享 共享库(*.so)中的变量?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?
  • 用samba共享其它机子访问Linux共享时,机子可以进入,但要打开共享文件夹时提示“无法访问...找不到网络名。”这是什么原因呢?
  • 局域网中的红旗2.0如何共享到win98服务器的联接共享?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?解决立即给分
  • 几个servlet共享一些数据 如我从数据库里读出一些重要的设置存入vector 让几个servlet共享 怎么做到?先谢
  • 求助linux普通用户下内存共享(系统V共享)大家进来看看啊!急!!
  • 关于中断共享的问题:ADC 与触摸屏的中断共享
  • 无法访问samba服务器中的共享文件夹
  • XP下设置与linux 本地连接的Internet共享问题
  • 我想知道LINUX如何与WIN98,WIN2000共享资源?
  • 多进程共享变量
  • 请教共享库运行时加载的问题
  • 创建共享失败。
  • 怎么我设置好vmwaretool后,还不能共享文件
  • 嵌入式linux下线程通信可以用共享文件法吗?
  • Gnome个人文件共享怎么用?
  • 当别人用FTP协议访问我的LINUX时,要显示一些共享文件夹。
  • Unix下如何在两个进程之间共享一块大内存??????


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3