了解多线程共享资源:shmid、shmat、shmdt
Understanding multithreading shared ressourced : shmid, shmat, shmdt
今天第一次尝试在我的计算 class 上使用为教育目的而资源的共享内存。 我无法理解核心转储错误的来源。该程序的目的是使用两个单独的线程写入一个通用的 table 字母表中的 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;
}
感谢您的帮助
因为 shmid = shmget(2017, SHMSIZE*sizeof(char), 0666 | IPC_CREAT)
如果没有其他可用的 key:2017 共享内存,则创建共享内存,你应该在分叉之前放置该行,以便每个进程都可以使用 shmid 并附加到共享内存通过那个。
在您的源代码中,每个进程都看不到共享内存,并且它们各自创建了单独的共享内存(!)。
今天第一次尝试在我的计算 class 上使用为教育目的而资源的共享内存。 我无法理解核心转储错误的来源。该程序的目的是使用两个单独的线程写入一个通用的 table 字母表中的 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;
}
感谢您的帮助
因为 shmid = shmget(2017, SHMSIZE*sizeof(char), 0666 | IPC_CREAT)
如果没有其他可用的 key:2017 共享内存,则创建共享内存,你应该在分叉之前放置该行,以便每个进程都可以使用 shmid 并附加到共享内存通过那个。
在您的源代码中,每个进程都看不到共享内存,并且它们各自创建了单独的共享内存(!)。