【问题标题】:Understanding multithreading shared ressourced : shmid, shmat, shmdt了解多线程共享资源:shmid、shmat、shmdt
【发布时间】:2017-11-20 11:12:37
【问题描述】:

今天第一次在我的计算机课上尝试使用为教育目的而资源的共享内存。 我不明白 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;
}

感谢您的帮助

【问题讨论】:

  • 您需要检查对shmgetshmat 的调用是否有错误!
  • 您在测试和调试时发现了什么?哪条线路产生故障?

标签: c multithreading memory shared coredump


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多