日期:2014-05-16  浏览次数:20635 次

求高手改错 关于进程通信的
求高手改错;为什么结果不能输出预想的 get I love you forever

#include<stdio.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>

#define SHMKEY 75

int shmid ,i;
char *addr;
char *argv[]={"I LOVE YOU FOREVER"};


void B()
{
  shmid=shmget(SHMKEY,5112,0777);
  addr=shmat(shmid,0,0);
  memset(addr,'\0',512);
  //printf("1 %s",*argv);
  strncpy(addr,argv[0],512);
  exit(0);
  }
void A()
{
  shmid=shmget(SHMKEY,512,0777|IPC_CREAT);
  addr=shmat(shmid,0,0);
  printf("get %s\n",addr);
  exit(0);
  }


main()
{
  while((i=fork())==-1);
  if(!i)A();
  while((i=fork())==-1);
  if(!i)B();
  wait(0);
  wait(0);
  }


------解决方案--------------------
你这个依赖于两个进程的执行顺序吧
如果在B放入数据之前,A就执行完了,当然没有显示了

建议在fork()之前,由主进程创建共享内存段,并shmat()
然后fork()的两个进程直接用这个地址就行了
------解决方案--------------------
void B()
{
  
addr=shmat(shmid,0,0);
memset(addr,'\0',512);
//printf("1 %s",*argv);
strncpy(addr,argv[0],512);
exit(0);
}
这个函数改一下,shmid=shmget(SHMKEY,512,0777);把5112改成512
最好再各个函数里加点延时,
------解决方案--------------------
#include<stdio.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>
#include <stdlib.h>

#define SHMKEY 75

int shmid ,i;
char *addr;
char *argv={"I LOVE YOU FOREVER"};


void B()
{
shmid=shmget(SHMKEY,512,0777);
addr=shmat(shmid,0,0);
memset(addr,'\0',512);
//printf("1 %s",argv);
strcpy(addr,argv);
//printf("%s",addr);
exit(0);
}
void A()
{
shmid=shmget(SHMKEY,512,0777|IPC_CREAT);
addr=shmat(shmid,0,0);
printf("get %s\n",addr);
exit(0);
}


main()
{
while((i=fork())==-1);
if(!i)A();
wait(0);
while((i=fork())==-1);
if(!i)B();
wait(0);
}