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

读共享内存的问题

    来源: 互联网  发布时间:2016-09-14

    本文导语:  两个程序,一个向共享内存写数据(时间日期数据),一个读数据,当写数据的时候,读数据的程序会挂掉,发生段错误,以下是代码: 结构体 typedef struct daytime { char *year; char *month; char *day; char *hour; char *min; ...

两个程序,一个向共享内存写数据(时间日期数据),一个读数据,当写数据的时候,读数据的程序会挂掉,发生段错误,以下是代码:

结构体
typedef struct daytime
{
char *year;
char *month;
char *day;
char *hour;
char *min;
char *sec;
int flag;
}dt;

//写进程
int write(){
                  char cmd[256]={0};
char buf1[10],buf2[10];

const char *y = getCGIvarByKey("year",pVars);
int mon = atoi(getCGIvarByKey("month",pVars));
sprintf(buf1,"%02d",mon);

int d = atoi(getCGIvarByKey("day",pVars));
sprintf(buf2,"%02d",d);

const char *h = getCGIvarByKey("hour",pVars);
const char *min = getCGIvarByKey("minute",pVars);
const char *s = getCGIvarByKey("second",pVars);

int running = 1;
void *shared_memory = (void *)0;
dt *pdt;
char buffer[BUFSIZ];
int shmid;

shmid = shmget((key_t)1234, sizeof(dt), 0666 | IPC_CREAT);

 if(shmid == -1)
{
fprintf(stderr, "shmget failedn");
exit(EXIT_FAILURE);
}

shared_memory = shmat(shmid, (void *)0, 0);
if(shared_memory == (void *)-1)
{
fprintf(stderr, "shmat failedn");
exit(EXIT_FAILURE);
}

printf("Memory attached at %Xn", (int)shared_memory);

pdt = (dt *)shared_memory;

pdt->year = y;
pdt->month = buf1;
pdt->day = buf2;
pdt->hour = h;
pdt->min = min;
pdt->sec = s;
pdt->flag = 1;
cgiDebug(pdt->year);


if(shmdt(shared_memory) == -1)
{
fprintf(stderr, "shmdt failedn");
exit(EXIT_FAILURE);
}

exit(EXIT_SUCCESS);
}

//读进程
int main()
{
printf("begin");
int running = 1;
void *shared_memory = (void *)0;
int shmid;

shmid = shmget((key_t)1234, sizeof(dt), 0666|IPC_CREAT);
if(shmid == -1)
{
fprintf(stderr, "shmget failedn");
exit(EXIT_FAILURE);
}
shared_memory = shmat(shmid, (void *)0, 0);
if(shared_memory == (void *)-1)
{
fprintf(stderr, "shmat failedn");
exit(EXIT_FAILURE);
}
 
dt *pdt = (dt *)shared_memory;
printf("flag=%dn", pdt->flag);

// pdt->flag = 0;
while(running)
{
if(pdt->flag)
{
printf("flag");
char cmd[256] = {0};
char buf1[8] = {0};
char buf2[8] = {0};
int mon = atoi(pdt->month);
int day = atoi(pdt->day);
sprintf(buf1,"%02d",mon);
sprintf(buf2,"%02d",day);

strcat(cmd,pdt->year);
strcat(cmd,buf1);
strcat(cmd,buf2);
strcat(cmd," ");
strcat(cmd,pdt->hour);
strcat(cmd,":");
strcat(cmd,pdt->min);
strcat(cmd,":");
strcat(cmd,pdt->sec);
printf("cmd=%sn", cmd);
system(cmd);
pdt->flag = 0;
}
}
if(shmdt(shared_memory)==-1)
{
fprintf(stderr, "shmdt failedn");
exit(EXIT_FAILURE);
}
 
if(shmctl(shmid, IPC_RMID, 0)==-1)
{
fprintf(stderr, "shmctl(IPC_RMID) failedn");
exit(EXIT_FAILURE);
}
 
    exit(EXIT_SUCCESS);
}


错误代码:
pc : []    lr : []    Not tainted
sp : bffffc60  ip : 400920e8  fp : bffffd94
r10: 4013d180  r9 : 00008658  r8 : 4013f430
r7 : 00000001  r6 : 00008930  r5 : 4001bd80  r4 : bffffdc4
r3 : 00000000  r2 : bffffc77  r1 : 00086c00  r0 : bffffc78
Flags: nZCv  IRQs on  FIQs on  Mode USER_32  Segment user
Control: C000317F  Table: 33568000  DAC: 00000015
Segmentation fault

高手给看看什么问题!谢谢

|
你的结构体定义错误:
结构体
typedef struct daytime
{
char *year;
char *month;
char *day;
char *hour;
char *min;
char *sec;
int flag;
}dt;
都是指针,改成
结构体
typedef struct daytime
{
char year[4];
char month[2];
char day[2];
char hour[2];
char min[2];
char sec[2];
int flag;
}dt;

|
你加几条printf语句,看看在什么地方Segmentation fault

|
恩。不能定义成指针,因为没有空间在结构体中存放数据。

    
 
 

您可能感兴趣的文章:

  • Linux 共享内存介绍及实现代码
  • java/j2ee iis7站长之家
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 程序需要共享内存相当大,但是系统的内存有限
  • 在linux下能不能创建一个堆,然后给堆指定一块共享内存,然后各个程序用此堆来new对象来共享?
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • 不同用户user之间如何访问共享内存?
  • Unix/linux下如何监测共享内存的使用情况
  • 共享内存问题,高手们请进!!!
  • 判断共享内存中是否有数据
  • 【求助】linux下什么是共享内存,怎么查看。
  • linux下共享内存的覆盖或清空
  • 进程同时访问两个大共享内存,会失败?
  • 共享内存和信号灯同步问题
  • 为什么不将数据直接写入共享内存?
  • aix 的开个共享内存的问题
  • linux下共享内存 函数shmat()的使用!
  • 请详细介绍一下共享内存机制~~
  • 初学者关于共享内存的几个问题-->
  • 文件描述符的限制?(共享内存)
  • 在语言中,什么是共享内存,怎样使用,举例?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?解决立即给分
  • 关于中断共享的问题:ADC 与触摸屏的中断共享
  • XP下设置与linux 本地连接的Internet共享问题
  • 请教共享库运行时加载的问题
  • 请教访问samba文件共享的问题
  • fedora10 与 windows共享目录问题
  • 小问题:Virtual PC与主机共享目录不需网络的方法
  • 父子进程共享数据的问题
  • Fedora12 用smb://ip 访问xp机器共享问题。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












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


  • 站内导航:


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

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

    浙ICP备11055608号-3