C Sharedmemory only 1024 int in forked process
C Sharedmemory only 1024 int in forked process
我应该编写一个程序,将整数写入共享内存,派生一个子进程,子进程应该读取整数。
shm.c
#define N_SHARED 2000
int main(int argc, char **argv) {
/* Ein Shared-Memory-Segment einrichten */
shmid = shmget(IPC_PRIVATE, N_SHARED, IPC_CREAT | SHM_R | SHM_W);
if (shmid == -1) {
perror("shmid");
exit(1);
}
/* Pointer zu Sharedm-Memory-Segment erhalten */
shmData = (int *)shmat(shmid,0, N_SHARED);
if (shmData == (int *)(-1)) {
perror("shmat");
exit(1);
}
/** ininitalisieren des Zufallsgenerator durch aktuellen Zeitstempel */
srand48(time(NULL));
for (i=0; i<N_SHARED; i++) {
shmData[i] = lrand48();
printf("SHM-->%d-->%d\n",i+1,shmData[i]);
}
pid = fork();
snprintf(shmidArg,32, "%d", shmid);
// Kindprozess
if (pid == 0) {
execlp("./shm_child",shmidArg,NULL);
} else if (pid < 0) {
perror("Kindprozess konnte nicht erzeugt werden!");
return 1;
}
shm_child.c
#define N_SHARED 2000
int i;
int *shmData;
static int shmid;
int main(int argc, char **argv) {
shmid = atoi(argv[0]);
printf("shm_child shared memoryid:%d\n",shmid);
/* Shared-Memory laden */
shmData = (int *)shmat(shmid,0,0);
if (shmData == (int *)(-1)) {
perror("shmat");
exit(1);
}
for(i=0;i<N_SHARED;i++) {
printf("%d --> %d\n",i+1,shmData[i]);
}
我的问题:索引 1024 之后的每个数字在 child_process 中都是 0,但在主进程中不是。
谢谢
我相信如果您将 #define N_SHARED 2000
更改为 #define N_SHARED 2000*sizeof(int)
,您的代码应该会按预期工作。
shmat
分配共享内存,其大小等于大小值四舍五入为 PAGE_SIZE 的倍数。您的代码尝试分配 2000 个字节,四舍五入为 4096,即 1024 * sizeof(int)
。这解释了为什么第一个 1024 int 具有预期值。
我应该编写一个程序,将整数写入共享内存,派生一个子进程,子进程应该读取整数。
shm.c
#define N_SHARED 2000
int main(int argc, char **argv) {
/* Ein Shared-Memory-Segment einrichten */
shmid = shmget(IPC_PRIVATE, N_SHARED, IPC_CREAT | SHM_R | SHM_W);
if (shmid == -1) {
perror("shmid");
exit(1);
}
/* Pointer zu Sharedm-Memory-Segment erhalten */
shmData = (int *)shmat(shmid,0, N_SHARED);
if (shmData == (int *)(-1)) {
perror("shmat");
exit(1);
}
/** ininitalisieren des Zufallsgenerator durch aktuellen Zeitstempel */
srand48(time(NULL));
for (i=0; i<N_SHARED; i++) {
shmData[i] = lrand48();
printf("SHM-->%d-->%d\n",i+1,shmData[i]);
}
pid = fork();
snprintf(shmidArg,32, "%d", shmid);
// Kindprozess
if (pid == 0) {
execlp("./shm_child",shmidArg,NULL);
} else if (pid < 0) {
perror("Kindprozess konnte nicht erzeugt werden!");
return 1;
}
shm_child.c
#define N_SHARED 2000
int i;
int *shmData;
static int shmid;
int main(int argc, char **argv) {
shmid = atoi(argv[0]);
printf("shm_child shared memoryid:%d\n",shmid);
/* Shared-Memory laden */
shmData = (int *)shmat(shmid,0,0);
if (shmData == (int *)(-1)) {
perror("shmat");
exit(1);
}
for(i=0;i<N_SHARED;i++) {
printf("%d --> %d\n",i+1,shmData[i]);
}
我的问题:索引 1024 之后的每个数字在 child_process 中都是 0,但在主进程中不是。
谢谢
我相信如果您将 #define N_SHARED 2000
更改为 #define N_SHARED 2000*sizeof(int)
,您的代码应该会按预期工作。
shmat
分配共享内存,其大小等于大小值四舍五入为 PAGE_SIZE 的倍数。您的代码尝试分配 2000 个字节,四舍五入为 4096,即 1024 * sizeof(int)
。这解释了为什么第一个 1024 int 具有预期值。