繁体   English   中英

使用C中的进程的共享内存问题

[英]Shared memory issue using processes in C

我正在开发一个程序,该程序将变量Bank存储在共享内存中并导致竞争状态。 我的代码可以编译,但是只打印初始余额报表,而不打印结果余额。 本质上,程序应使用竞态条件打印除200以外的余额,并且当使用信号量固定该条件时,它应使用不同的数字以始终打印200的余额。我错过了什么而导致程序被捕获第一次printf之后?

    #include <unistd.h> 
    #include <stdio.h> 
    #include <stdlib.h>  
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    #include <semaphore.h>
    #include <string.h>

    //sem_t mutex; // semaphore global variable

    struct {
        int balance[2];
    }

    Bank = {{100, 100}};

    //struct Bank *bank;

    // routine for thread execution
    void* MakeTransactions() { 
        key_t shmkey;
        int shmid, seqid;
        int seqnum = 5858;
        int i, j, tmp1, tmp2, rint;
        int *shmint1, *shmint2;
        double dummy;

        if ((shmkey=ftok(getenv("HOME"), seqnum))==(key_t)-1) {
            perror("ERROR: ftok"); 
            }
        else if ((shmid=shmget(shmkey,sizeof(int)*2,0600|IPC_CREAT))==-1) {
            perror("ERROR: shmget");
            }
        if ((shmint1=(int *)shmat(shmid,NULL,0600))==(int*)-1) {
            perror("ERROR: shmalloc");
            }
        shmint2 = shmint1 + 1;

        // wait on semaphore
        //sem_wait(&mutex);

        for (i=0; i < 100; i++) {  
            rint = (rand()%30)-15; 
            if (((tmp1= *shmint1)+rint) >=0 &&
                    ((tmp2= *shmint2)-rint)>=0) { 
                //sem_wait(&mutex);
                //bank->balance[0] = tmp1 + rint;
                *shmint1 = tmp1 + rint;
                //sem_post(&mutex); 

                usleep(5000);

                for (j=0; j < rint*100; j++) {
                    dummy=2.345*8.765/1.234; // spend time on purpose
                }
                //sem_wait(&mutex);
                //bank->balance[1] = tmp2 - rint;
                *shmint2 = tmp2 - rint;
                //sem_post(&mutex); 
            }  
        } 
        Bank.balance[0]= *shmint1;
        Bank.balance[1]= *shmint2;

        // increment value of semaphore
        //sem_post(&mutex);
        return NULL;
    } 
    vint main(int argc, char **argv) { 

        key_t shmkey;
        int shmid, seqid, seqnum;
        int *shmint1, *shmint2;
        int i;

        // initialize semaphore
        //sem_init(&mutex, 0, 1);

        // shared memory
        //bank = mmap(NULL, sizeof(struct Bank), PROT_READ | PROT_WRITE,                         MAP_SHARED | MAP_ANONYMOUS, -1, 0);
        if ((shmkey=ftok(getenv("HOME"), seqnum))==(key_t)-1) {
            perror("ERROR: ftok"); 
            }
        else if ((shmid=shmget(shmkey,sizeof(int)*2,0600|IPC_CREAT))==-1) {
            perror("ERROR: shmget");
            }
        if ((shmint1=(int *)shmat(shmid,NULL,0600))==(int*)-1) {
            perror("ERROR: shmalloc");
            }

        shmint2 = shmint1 + 1;

        memset((int*)shmint1,0,sizeof(int));
        memset((int*)shmint2,0,sizeof(int));

        /*//check if bank is not NULL
        Bank.balance[0] = 100;
        Bank.balance[1] = 100;
        */

        *shmint1 = Bank.balance[0];
        *shmint2 = Bank.balance[1];

        pid_t pid;
        srand(getpid()); 

        printf("\nInit balances A:%d + B:%d ==> %d!\n",*shmint1,*shmint2,*shmint1 + *shmint2); 

        pid=fork();
        if (pid < 0) {
            fprintf(stderr, "Fork failed");
            return 1;
        }
        if (pid == 0) {
            MakeTransactions();
            return 0;
        }
        else {
            MakeTransactions();
            wait(NULL);
            return 0;
        }
        printf("Let's check the balances A:%d + B:%d ==> %d ?= 200\n\n",*shmint1,*shmint2,*shmint1 + *shmint2);

        //sem_destroy(&mutex);

        // deattach shared memory pointer
        shmdt(shmint1);
        shmctl(shmid, IPC_RMID, NULL); 

        // memory unmap struct
        //munmap(bank, sizeof(struct Bank));

        return 0; 
    }

如此处所述 ,您正在使用的wait()方法在解析NULL时可能会导致未定义的行为; 它使用整数指针作为过程完成的指标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM