2014-04-03 64 views
0

我在共享內存方面遇到了一些問題。我想將一個值從程序a傳遞到共享內存中,然後將其與程序b中的共享內存混淆在一起,然後程序就可以讀取。到目前爲止,我只能讓它向我展示我輸入的價值。我不知道是否需要在從共享內存中讀取內容和寫入內容之間進行糾正的時機,或者我是否有錯誤的想法一般。任何幫助將不勝感激。在兩個程序之間使用共享內存

當我運行的程序,該命令行看起來像:./a 2 3 4 ./b

然後,它要求一個值:3

輸出:3

其應該在某些權力上增加3並乘以命令行中的係數。

方案一:

#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

您可能需要程序A和B.程序之間,即更好的同步程序B需要知道,當程序A完成將輸入放入SHM時。例如,放置輸入後,程序A可能會向程序B發送信號。或者,您可以使用信號量。

此外,不要假設整數讀/寫是原子的。

shmptr[ok]=value; // A 

x=shmptr[i];  // B 
+0

等待聲明是否合適?等到shmptr [ok]!=輸入的值爲止? – Joe

+0

wait()系統調用用於等待調用進程的子進程中的狀態更改。但是,據我瞭解這個問題,A和B是獨立的過程,彼此的孩子也不是。 – Arun

+0

噢好吧,直到值不再相同的循環呢?while(value == shmptr [ok]){};? – Joe

相關問題