首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在两个程序之间使用共享内存

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

Stack Overflow用户
提问于 2014-04-04 04:58:38
回答 1查看 1.8K关注 0票数 0

我在共享内存方面遇到了一些问题。我想把一个值从程序a传递到共享内存中,它会被打乱,然后从程序b放回共享内存中,然后程序就可以读取了。到目前为止,我只能让它显示我输入的值。我不知道是不是在从共享内存读取到写入之间需要纠正的时间,或者我总体上有一个错误的想法。任何帮助都将不胜感激。

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

然后要求输入一个值:3

输出:3

它应该将3提升到一些幂,然后在命令行中乘以这些系数。

程序a:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 2014-04-04 05:09:28

您可能需要在程序A和程序B之间进行更好的同步。也就是说,程序B需要确切地知道程序A何时完成了将输入放入SHM。例如,在放置输入之后,程序A可能会向程序B发送一个信号,或者,您可以使用信号量。

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

代码语言:javascript
复制
shmptr[ok]=value;  // A

x=shmptr[i];       // B
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22848861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档