gpt4 book ai didi

c - 访问共享内存段的进程返回不同的值

转载 作者:太空宇宙 更新时间:2023-11-04 08:00:09 24 4
gpt4 key购买 nike

我是 IPCS 概念的新手,我想实现一个进程创建并初始化共享内存,然后调用另一个进程附加到同一共享内存段并打印共享内存中的数据。但是我无法实现它:

算法通用.h

struct sub_algo_shm
{
int time;
int pno;
};
struct AlgoShm
{
int head;
int tail;
char fFlag;
struct sub_algo_shm algoshm;
};

AlgoThrottle.c

#define key (key_t)111119
#define SHM_SIZE 1024

int main()
{
int shmid ;
struct timeval CurTime;
struct timespec nTime;
struct AlgoShm *shmaddr,*ptr;

ptr = (struct AlgoShm *)malloc(10*sizeof(struct AlgoShm));
//Creating Shared Memory
if((shmid = shmget(key,SHM_SIZE,0644 |IPC_CREAT)) < 0)
{
perror("shmget:error");
}
else
{
printf("Shm created key=[%d] \n Segment Id [%d] ",key,shmid);
//Attaching to Shared Memory
shmaddr = (struct AlgoShm *)shmat(shmid,0,0);
if(shmaddr < 0)
{
perror(" shmat :error");
}
else
{
printf(" SHM Segment attached at [%x] ",shmaddr);
}
//Loading/Initializing Data Blocks in SHM
clock_gettime(CLOCK_REALTIME,&nTime);
printf(" Time in N secs[%ld] \n ",nTime.tv_nsec);
ptr->head = 5;
ptr->tail = 3;
ptr->fFlag = '0';
ptr->algoshm.time = 0;
ptr->algoshm.pno = 1;
//memcpy(shmaddr,&ptr,sizeof(ptr));
printf(" AlgoThrottle|ptr->head [%d] ",ptr->head);
// sleep(1);
system("./AlgoRead");

}

return 0;
}

算法阅读.c

#define key (key_t)111119
#define SHM_SIZE 1024

int main()
{

int shmid ;
struct AlgoShm *shmaddr,*ptr1 ;
ptr1 = (struct AlgoShm *)malloc(10*sizeof(struct AlgoShm));

if((shmid = shmget(key,SHM_SIZE,0)) < 0)
{

perror(" AlgoRead|shmget:error ");
}
else
{
printf(" AlgoRead|SHM Created shmid [%d] ",shmid);

if((shmaddr = (struct AlgoShm *)shmat(shmid,0,0)) < 0)
{
perror("AlgoRead|shmat error");
}
else
{
//memcpy(ptr1,shmaddr,sizeof(struct AlgoShm));
printf(" AlgoRead|Attached to Segment at Address[%x] \n ",shmaddr);
printf(" AlgoRead|ptr1->head [%d] ptr1->tail [%d] ptr1->fFlag[%c] \n ",ptr1->head,ptr1->tail,ptr1->fFlag);
}
}

return 0;
}

这是我的输出:

Shm created key=[111119]
Segment Id [1179615678] SHM Segment attached at [4a6b4000] Time in N secs[114594083]
AlgoRead|SHM Created shmid [1179615678] AlgoRead|Attached to Segment at Address[624cb000]
AlgoRead|ptr1->head [36810768] ptr1->tail [0] ptr1->fFlag[▒]
AlgoThrottle|ptr->head [5]

此外,系统调用的输出首先显示,然后是 printf 语句,即使我在调用 system() 之前使用了 sleep(1)

最佳答案

首先,如果您正在使用 共享内存 那么为什么要使用 malloc() ?共享内存本身会将 shmidshared memory 关联,您不必显式执行 malloc()。

第二件事,您将 shmaddr 指针附加到 shmat() 返回的内存中,但将数据放入ptrptr堆内存 相关联,而不是与共享内存 相关联。所以要么将数据放入 shmaddr 指针中,要么替换这个

shmaddr = (struct AlgoShm *)shmat(shmid,0,0);

ptr = (struct AlgoShm *)shmat(shmid,0,0);

并且不要使用 mallocc() 分配内存。然后执行

                ptr->head = 5;
ptr->tail = 3;
ptr->fFlag = '0';
ptr->algoshm.time = 0;
ptr->algoshm.pno = 1;

在两个过程中进行所有这些修改。最后,您应该执行 shmdt() 以解除附加共享内存,否则将是 内存泄漏

我将你的代码修改为一个.c :

int main()
{
int shmid ;
struct timeval CurTime;
struct timespec nTime;
struct AlgoShm *shmaddr,*ptr;
if((shmid = shmget(key,SHM_SIZE,0644 |IPC_CREAT)) < 0)
{
perror("shmget:error");
}
else
{
printf("Shm created key=[%d] \n Segment Id [%d] ",key,shmid);
ptr = (struct AlgoShm *)shmat(shmid,0,0);
if(shmaddr < 0)
{
perror(" shmat :error");
}
else
{
printf(" SHM Segment attached at [%x] ",ptr);
}
clock_gettime(CLOCK_REALTIME,&nTime);
printf(" Time in N secs[%ld] \n ",nTime.tv_nsec);
ptr->head = 5;
ptr->tail = 3;
ptr->fFlag = 'a';
ptr->algoshm.time = 10;
ptr->algoshm.pno = 11;
printf(" AlgoThrottle|ptr->head [%x] ",ptr->head);

}
system("./AlgoRead");
return 0;
}

两个.c:

int main()
{
int shmid ;
struct AlgoShm *shmaddr,*ptr1 ;
if((shmid = shmget(key,SHM_SIZE,0)) < 0)
{

perror(" AlgoRead|shmget:error ");
}
else
{
printf(" AlgoRead|SHM Created shmid [%d] ",shmid);

if((ptr1 = (struct AlgoShm *)shmat(shmid,0,0)) < 0)
{
perror("AlgoRead|shmat error");
}
else
printf(" AlgoRead|Attached to Segment at Address[%x] \n ",ptr1);
printf(" AlgoRead|ptr1->head [%d] ptr1->tail [%d] ptr1->fFlag[%c] \n ",ptr1->head,ptr1->tail,ptr1->fFlag);
}
shmdt(ptr1);
return 0;
}

希望对您有所帮助,我建议您正确阅读 shmget()、shmat() 和 shmdt() 的手册页。

关于c - 访问共享内存段的进程返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47308654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com