Linux-Ubuntu:具有动态分配变量的共享内存,必须由其他可执行文件更改

Posted

技术标签:

【中文标题】Linux-Ubuntu:具有动态分配变量的共享内存,必须由其他可执行文件更改【英文标题】:Linux-Ubuntu: Shared Memory with a variable dynamically allocated that must be change by other executables 【发布时间】:2021-12-28 19:45:22 【问题描述】:

我正在尝试添加到 (START) 可执行文件中动态分配的 int。 此变量必须使用共享内存与其他可执行文件共享 (SECOND)。 出于某种原因,当我尝试使用 (SECOND) 可执行文件对该变量进行操作时,软件只需跳过它并继续 (START) 可执行文件。 我还是这个话题的新手...

This is the (START) executable code

The header

The (SECOND) executable

The Makefile

顺便说一下,所有这些文件都在同一个文件夹中 对不起我的英语不好,我希望有人可以帮助我。 如果我使用非动态分配的变量,此代码也可以工作

开始

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include "test.h"

int main()
key_t shmKEY;
shmKEY= ftok(".",'a');

int shmID = shmget(shmKEY,4*sizeof(INT),IPC_CREAT | 0664);
INT A;

A=shmat(shmID,NULL,0);
//A=malloc(4*sizeof(INT));

A[0]=1;
A[1]=2;
A[2]=3;
A[3]=4;

for(int i=0;i<4;i++)
    printf("[%d]",A[i]);

printf("\n");

pid_t pid;
pid=fork();
if(pid<0)
    perror("ERRORE FORK\n");

else if(pid==0)
    execl("./SECOND","./SECOND",NULL);
    exit(1);


if(pid>0)
    wait(NULL);
    for(int i=0;i<4;i++)
        printf("[%d]",A[i]);
    
    printf("\n");




//free(A);
shmctl(shmID,IPC_RMID,0);
return 0;

第二

#include "test.h"
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>

int main()
key_t shmKEY;
shmKEY= ftok(".",'a');

int shmID = shmget(shmKEY,0,IPC_CREAT | 0664);
INT A;

A=shmat(shmID,NULL,0);
printf("DEBUG0\n");
A[0]=A[0]+1;
A[1]=A[1]+1;
A[2]=A[2]+1;
A[3]=A[3]+1;

for(int i=0;i<4;i++)
        printf("[%d]",A[i]);
    
printf("\n");
printf("DEBUG1\n"); 
return 0;

标题

#ifndef _TEST_H
#define _TEST_H
typedef int* INT;

#endif

制作文件

All: START SECOND

START:main.o
     gcc main.o -o START

SECOND:second.o
     gcc second.o -o SECOND

second.o:second.c test.h
     gcc -c second.c        

main.o: main.c test.h
     gcc -c main.c

clean:
     rm *.o START SECOND        

【问题讨论】:

欢迎来到 Stack Overflow!请以文本形式发布代码,而不是屏幕截图。 idownvotedbecau.se/imageofcode A=malloc(4*sizeof(INT)); 将指向共享内存的指针替换为指向本地堆内存的指针。 摆脱对malloc()的调用。 我删除了 A=malloc(..) 我将 rmeove 图像并 pu 代码,我不明白您的意思是“将指向共享内存的指针替换为堆内存” malloc() 从堆中分配新内存。您将其分配给A。所以现在A 包含一个指向该堆内存的指针,而不是指向您在上一行使用shmat() 分配的共享内存的指针。 【参考方案1】:

谢谢大家,只需要删除malloc而不是盲目,我必须更好地学习这个主题。

【讨论】:

答案更适合作为评论。

以上是关于Linux-Ubuntu:具有动态分配变量的共享内存,必须由其他可执行文件更改的主要内容,如果未能解决你的问题,请参考以下文章

变量的生存期和存储分配

对具有“易失性”属性的动态分配变量的内存访问是不是会导致每次访问的缓存未命中?

具有动态共享内存的模板化 CUDA 内核

为VirtualBox下Linux-Ubuntu虚拟机增加虚拟硬盘容量(傻瓜化操作,全程UI下完成)

动态内存

动态内存