首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解多线程共享重新来源: shmat,shmdt

理解多线程共享重新来源: shmat,shmdt
EN

Stack Overflow用户
提问于 2017-11-20 11:12:37
回答 1查看 204关注 0票数 0

今天,我第一次尝试使用共享内存重新获得资源,是为了我的计算机课的教育目的。我不明白核心部分错误是从那里来的。该程序的目的是使用两个单独的线程将26个字母编成一个通用的表,一个用Caps写,另一个用普通字母写。

下面是我写的代码:

代码语言:javascript
复制
#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;
}

谢谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-20 11:58:10

由于如果没有其他密钥共享内存:2017可用,shmid = shmget(2017, SHMSIZE*sizeof(char), 0666 | IPC_CREAT)将创建共享内存,因此您应该在分叉之前放置该行,以便每个进程都可以使用shmid并据此附加到共享内存。在您的源代码中,每个进程都看不到共享内存,而且每个进程都有单独的共享内存(!)已创建。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47390667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档