我做了共享内存下的ipc那个实验,老是出问题,我看不出来。
请各位帮我看看。在linux下试过了,也用gdb看过。我觉得问题可能出在内存共享方面。
大体是这样的:fork后,父进程读文件,此时我采用sleep让子进程
等待父进程读完才能操作(判断是否为回文)。然后父进程wait,等子进程
判断完并将结果输出完后,exit(0),结束。此前子进程已结束。
我用gdb看过,读文件内容到内存中操作没问题,内存中结果也对。
但到了子进程工作时,从内存中读出数据时,读出的并非文件内容。而且
子进程中指向共享内存的指针(c_addr)所指内容也不是文件内容。即此
指针不对,但我是用c_addr=shmat(shmid,0,0);不知到底错在哪里。
[code:1]
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
int func(char str1[],char str2[])//判断是否为回文
{
char str[128];
int i=0,j=0;
while(str1[j]!='\0')
{
if(str1[j]!=' ')
{
str[i]=str1[j];
i++;
}
j++;
}
str1[i]='\0';
i--;
j=0;
while(i>=0)
str2[j++]=str1[i--];
str2[j]='\0';
if(strcmp(str,str2)==0)
return 1;
else return 0;
}
int main(int argc,char **argv)
{
int shmid;
pid_t pid,cid;
int count=0;
int leng;
int i,k;
char ch='\0';
char filename[20];
char str1[128];
char str2[128];
char *p_addr,*c_addr;
if((shmid=shmget(IPC_PRIVATE,1024,IPC_CREAT|0666))==-1)
{
printf(stderr,"Create Share Memory Error:%s\n");
exit(1);
}
pid=fork();
if(pid==0)
{
sleep(10);
c_addr=shmat(shmid,0,0);
i=0;
while(1)
{
if(*c_addr=='\n'||*c_addr==EOF)
{
str1[i]='\0';
k=func(str1,str2);
printf("%s\t",str1);
if(k==1)
{
printf("Yes\n");
i=0;
}
else
{
printf("No\n");
i=0;
}
if(*c_addr==EOF) break;
}
else
{
str1[i]=*c_addr;
i++;
c_addr++;
}
}
shmdt(c_addr);
exit(0);
}//if(pid==0)
if(pid>0)
{
p_addr=shmat(shmid,0,0);
printf("please enter the name of the file:\n");
scanf("%s",filename);
FILE *fp;
fp=fopen(filename,"r");
if(fp==NULL)
{
printf("file doesn't exist\n");
exit(1);
}
while(1)
{
ch=fgetc(fp);
if(count>1023)
{
printf("memory use out\n");
exit(1);
}
*p_addr=ch;
p_addr++;
count++;
if(ch==EOF)
{
*p_addr='\0';
fclose(fp);
cid=wait(NULL);//等待子进程结束
break;
}
}
shmdt(p_addr);
exit(0);
}//if(pid>0)
if(pid==-1)
{
printf(stderr,"Fork Error\n");
exit(1);
}
printf("task finished\n");
return 1;
}
[/code:1]
求教大虾 |