在两个程序之间使用共享内存

时间:2014-04-03 20:58:38

标签: c fork shared-memory pid

我遇到了共享内存的一些问题。我想将一个值传递给程序a中的共享内存,该程序将被混乱并从程序b返回到该共享内存,然后该程序可以读取。截至目前,我只能向它展示我所投入的价值。我不知道从共享内存读取到写入之间是否需要纠正的时间,或者我是否有错误的想法一般。任何帮助将不胜感激。

当我运行程序时,命令行如下所示:./ a 2 3 4 ./b

然后要求一个值:3

输出:3

它应该将3增加到某些幂并乘以命令行中的那些系数。

计划a:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>

int main(int ac, char** a)
{
  key_t key=22;
  int size=1, shmflg=0;
  int id=0,ok=0,i=0, count=0;
  int *shmptr;
  int *pid;
  int status;
  double sum, value;
  char shmstr[10];
  char istr[10];   /* index for shared memory*/
  char arg1[10];
  char arg2[10];
  char power[10];

  count =(ac-2);
  size = count*sizeof(int);
  pid = (int*) malloc(size);
  shmflg = IPC_CREAT | SHM_R | SHM_W;
  id=shmget(key,size,shmflg);
  printf("%d get shmget\n",id);
  sprintf(shmstr, "%d",id);
  shmptr = shmat(id,0,0);
  for (i=0; (i < count); i=i+1){
     shmptr[i]=0;
  }  
  for (i=0; (i < count); i=i+1){
    if ((pid[i]=fork()) == 0) {
      sprintf(istr, "%d",ok);
      sprintf(power, "%d",((ac-2)-i));
      execlp(a[(ac-1)], a[(ac-1)], shmstr, istr,a[i+1],power, NULL);
    }
  }

/* /////////////////////////////////// I believe this is were the issue lies.*/
  printf("value?");
  scanf("%lf",&value);
  while(value!=0){
    sum=1;
    shmptr[ok]=value;``
    sum=shmptr[(ok+1)];
    printf("and the value is now %f \n", sum);
    printf("value?\n");
    scanf("%lf",&value);
  }

  for (i=0; (i < count); i=i+1){
      ok=waitpid(pid[i],&status,0);
      printf("%d wait on %d ok\n",ok, i);
    }

  ok=shmdt(shmptr);
  ok = shmctl(id,IPC_RMID,0);

}

计划b:

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


int main(int ac, char** a)
{
  int id=0,ok=0, i=0, j=0, power;
  int *shmptr;
  double x, mult, mycontrib, total;
  id = atoi(a[1]);
  i = atoi(a[2]);
  mult=atof(a[3]);
  power=atoi(a[4]);
  shmptr = shmat(id,0,0);
  x=shmptr[i];
  printf("child %d shmptr index value %d\n",i,shmptr[i]);
  while(x!=0){
    mycontrib=1;
    for(j=0;(j<power);j=j+1){
      mycontrib=mycontrib*x;
    }

    total=total+(mycontrib*mult);
    shmptr[i]=total;
  }
   ok=shmdt(shmptr);
   printf("%d child detach ok\n",ok);
}

1 个答案:

答案 0 :(得分:0)

您可能需要在程序A和程序B之间实现更好的同步。程序B最终需要知道程序A何时完成将输入放入SHM。例如,放置输入后,程序A可能会向程序B发送信号。或者,您可以使用信号量。

另外,不要假设整数读/写是原子的。

shmptr[ok]=value;  // A

x=shmptr[i];       // B