我遇到了共享内存的一些问题。我想将一个值传递给程序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);
}
答案 0 :(得分:0)
您可能需要在程序A和程序B之间实现更好的同步。程序B最终需要知道程序A何时完成将输入放入SHM。例如,放置输入后,程序A可能会向程序B发送信号。或者,您可以使用信号量。
另外,不要假设整数读/写是原子的。
shmptr[ok]=value; // A
x=shmptr[i]; // B