代码之家  ›  专栏  ›  技术社区  ›  Théophile Leroy

了解多线程共享资源:shmid、shmat、shmdt

  •  0
  • Théophile Leroy  · 技术社区  · 7 年前

    今天在我的计算机课上,我第一次尝试使用共享内存资源进行教育。 我不明白coredump错误是从哪里来的 . 该程序的目的是使用两个单独的线程将字母表的26个字母连接到一个公共表中,一个用大写字母书写,另一个用普通字母书写。

    这是我写的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/ipc.h> 
    #include <sys/shm.h> 
    #include <sys/wait.h>
    #include <unistd.h> 
    #include <string.h>
    
    #define SHMSIZE 52
    char tabMaj[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    char tabMin[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    
    int main(void){
        char c;
        int i=0;
        int shmid;
        char *shm;
    
    
        if (!fork()){  //soon code
            printf("FILS\n");
            // create shared memory segment
            shmid = shmget(2017, SHMSIZE*sizeof(char),  0666 | IPC_CREAT);
            // attach of the segment
            shm = shmat(shmid, 0, 0);
            char *s = (char *) shm;
            for(i=0;i<26;i++){
                *(s+1)=tabMin[i];
                s=s+2*sizeof(char);
            }
            shmdt(shm);
        }
        else{       //father code
            printf("PERE\n");
            shmid = shmget(2017,  SHMSIZE*sizeof(char), 0666 | IPC_CREAT);
            shm = shmat(shmid, 0, 0);
            char *s = (char *) shm;
            for(i=0;i<26;i++){
                *(s)=tabMaj[i];
                s=s+2*sizeof(char);
            }
            wait(NULL);
            shmdt(shm);
        }
    
        return 0;
    }
    

    谢谢你的帮助

    1 回复  |  直到 7 年前
        1
  •  0
  •   NaWeeD    7 年前

    自从 shmid = shmget(2017, SHMSIZE*sizeof(char), 0666 | IPC_CREAT) 如果没有其他具有key:2017的共享内存可用,则应在分叉之前放置该行,以便每个进程都可以使用shmid并通过该行连接到共享内存。 在您的源代码中,每个进程都看不到共享内存,它们都有单独的共享内存(!)创建。