Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中的共享内存变量_C_Fork_Shared Memory - Fatal编程技术网

c语言中的共享内存变量

c语言中的共享内存变量,c,fork,shared-memory,C,Fork,Shared Memory,我正在为uni做一个赋值,我在定义共享内存中的全局变量库时遇到了问题,因此我的进程有一个共享地址。我们正在探索竞争条件,我希望两个进程都调用MakeTransactions(),然后使用信号量来消除竞争条件。目前,关于共享内存,我一直遇到不同类型的错误(int vs struct)。有人能解释一下最好的方法是什么吗?任何建议都会有帮助。谢谢 #include <unistd.h> #include <stdio.h> #include <

我正在为uni做一个赋值,我在定义共享内存中的全局变量库时遇到了问题,因此我的进程有一个共享地址。我们正在探索竞争条件,我希望两个进程都调用MakeTransactions(),然后使用信号量来消除竞争条件。目前,关于共享内存,我一直遇到不同类型的错误(int vs struct)。有人能解释一下最好的方法是什么吗?任何建议都会有帮助。谢谢

    #include <unistd.h> 
    #include <stdio.h> 
    #include <stdlib.h>  
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/wait.h>

    struct Bank {
        int balance[2];
    };

    struct Bank = *bank;

    // routine for thread execution
    void* MakeTransactions() { 
        int i, j, tmp1, tmp2, rint;
        double dummy;

        for (i=0; i < 100; i++) {  
            rint = (rand()%30)-15; 
            if (((tmp1=bank->balance[0])+rint) >=0 &&
                    ((tmp2=bank->balance[1])-rint)>=0) { 
                bank->balance[0] = tmp1 + rint; 
                for (j=0; j < rint*100; j++) {
                    dummy=2.345*8.765/1.234; // spend time on purpose
                }
                bank->balance[1] = tmp2 - rint; 
            }  
        } 
        return NULL; 
    } 

    int main(int argc, char **argv) { 

        int i;
        void* voidptr = NULL;

            bank = mmap(NULL, sizeof(struct Bank), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
            //check if bank is not NULL
            bank->balance[0] = 100;
            bank->balance[1] = 100;

        pid_t pid;
        srand(getpid()); 

        printf("\nInit balances A:%d + B:%d ==> %d!", 
                bank->balance[0],bank->balance[1],bank->balance[0]+bank->balance[1]); 

        pid=fork();
        if (pid < 0) {
            fprintf(stderr, "Fork failed");
            return 1;
        }
        if (pid == 0) {
            printf("\nChild computing ...");
            MakeTransactions();
            printf("\nChild process complete");
            printf("\nLet's check the balances A:%d + B:%d ==> %d ?= 200",
            bank->balance[0],bank->balance[1],bank->balance[0]+bank->balance[1]);
            return 0;
        }
        else {
            printf("\nParent computing...\n");
            MakeTransactions();
            wait(NULL);
            printf("\nParent process complete\n");
            printf("Let's check the balances A:%d + B:%d ==> %d ?= 200\n\n",
                    bank->balance[0],bank->balance[1],bank->balance[0]+bank->balance[1]);
            return 0;
        }
        return 0; 
    }
#包括
#包括
#包括
#包括
#包括
#包括
结构银行{
国际收支平衡[2];
};
结构银行=*银行;
//线程执行的例程
void*MakeTransactions(){
int i,j,tmp1,tmp2,rint;
双假人;
对于(i=0;i<100;i++){
rint=(rand()%30)-15;
如果((tmp1=银行->余额[0])+rint)>=0&&
((tmp2=银行->余额[1])-rint>=0){
银行->余额[0]=tmp1+rint;
对于(j=0;j余额[1]=tmp2-打印;
}  
} 
返回NULL;
} 
intmain(intargc,字符**argv){
int i;
void*voidptr=NULL;
bank=mmap(NULL,sizeof(struct bank),PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0);
//检查银行是否不为空
银行->余额[0]=100;
银行->余额[1]=100;
pid_t pid;
srand(getpid());
printf(“\n IT余额A:%d+B:%d=>%d!”,
银行->余额[0],银行->余额[1],银行->余额[0]+银行->余额[1];
pid=fork();
if(pid<0){
fprintf(标准“Fork failed”);
返回1;
}
如果(pid==0){
printf(“\n希尔德计算…”);
MakeTransactions();
printf(“\n归档过程完成”);
printf(“\n让我们检查余额A:%d+B:%d==>%d?=200”,
银行->余额[0],银行->余额[1],银行->余额[0]+银行->余额[1];
返回0;
}
否则{
printf(“\n租金计算…\n”);
MakeTransactions();
等待(空);
printf(“\n租金处理完成\n”);
printf(“让我们检查余额A:%d+B:%d=>%d?=200\n\n”,
银行->余额[0],银行->余额[1],银行->余额[0]+银行->余额[1];
返回0;
}
返回0;
}

我将首先对您的代码进行一些重构,这样就可以清楚地了解为什么您的注释中的mmap无法工作

使结构声明非注释性:

struct Bank {
   int balance[2];
};
和您的全局:
structbank={{100100}。现在,这个
bank
变量在堆栈上,这将使切换到mmap更加困难。引入间接法:

struct Bank bankGlobal = {{100, 100}};
struct Bank *bank = &bankGlobal;
...
bank->balance[0] = tmp1 + rint;
现在,
bank
是指向
struct bank
的指针,它当前指向
bankGlobal
。您需要将所有
bank.
更改为
bank->
。使用此代码,您可以切换到
mmap
解决方案

首先,不能在全局空间中使用mmap初始化银行变量。它必须在功能上。其次,您试图获取指向Bank的指针的大小(
sizeof*Bank
),此时您应该以整个结构大小为目标

因此,改变这一点:

-struct Bank bankGlobal = {{100, 100}};
-struct Bank *bank = &bankGlobal;
+struct Bank *bank;
在主要功能方面:

bank = mmap(NULL, sizeof(struct Bank), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
//check if bank is not NULL
bank->balance[0] = 100;
bank->balance[1] = 100;
完成后别忘了画地图


关于比赛,你可以把这个
银行
结构放进去,并用和保护这个交易。

你收到错误消息了吗?!为什么不把它添加到问题中呢!另外,你的代码(mmap被注释掉)没有使用共享内存。我只是编译了你的代码,没有得到任何错误。。。只有一个关于
dummy
…的警告将
\n
放在
printf
格式控制字符串的末尾而不是开头,或者调用
fflush
请不要完全围绕您的问题范围进行编辑。当出现新问题时,询问新问题。