gpt4 book ai didi

c - 使用 shmctl() 销毁共享内存段 (Linux)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:04 24 4
gpt4 key购买 nike

我很难弄明白这一点。我有一些代码对使用信号量的生产者/消费者问题进行建模(P() 和 V() 分别只是通常的 wait() 和 signal() 函数)。

我为实现中使用的缓冲区分配了一些内存,但我不明白程序退出后如何正确销毁分配的空间。当我第二次运行程序时,这会产生问题,旧数据保留在内存中,甚至会弹出一个错误,不允许我再次分配共享空间。

代码如下:

#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>

#include "sem.h"


#define N 3
#define BUFSIZE 1
#define PERMS 0666 //0666 - To grant read and write permissions

int *buffer;
int nextp=0,nextc=0;
int mutex,full,empty; /* semaphore variables
* mutex - binary semaphore -- critical section
* full, empty - counting semaphore */

void producer()
{
int data;
if(nextp == N)
nextp=0;
printf("\nEnter the data(producer) :");
scanf("%d",(buffer+nextp));
nextp++;
}

void consumer()
{
int g;
if(nextc == N)
nextc=0;
g=*(buffer+nextc++);
printf("\nconsumer consumes the data:%d\n",g);
}

int main()
{
int shmid,no=1,i;
int pid,n;

if((shmid=shmget(1000,BUFSIZE,IPC_CREAT | PERMS)) < 0)
{
printf("\n unable to create shared memory");
return;
}
if((buffer=(int*)shmat(shmid,(char*)0,0)) == (int*)-1)
{
printf("\n Shared memory allocation error\n");
exit(1);
}

// semaphore creation
if((mutex=semget(IPC_PRIVATE,1,PERMS | IPC_CREAT)) == -1)
{
printf("\n can't create mutex semaphore");
exit(1);
}

if((empty=semget(IPC_PRIVATE,1,PERMS | IPC_CREAT)) == -1)
{
printf("\n can't create empty semaphore");
exit(1);
}

if((full=semget(IPC_PRIVATE,1,PERMS | IPC_CREAT)) == -1)
{
printf("\ncan't create full semaphore");
exit(1);
}

// initialze the semaphore
sem_create(mutex,1);
sem_create(empty,N);
sem_create(full,0);


//forking a child
if((pid=fork()) < 0)
{
printf("\n Error in process creation");
exit(1);
}

//Producer process
if(pid > 0)
{
for(i=0;i<N;i++)
{
P(empty);
P(mutex); // Entering critical section
producer();
V(mutex); // Exit from critical section
V(full);
}
wait();
semkill(mutex);
semkill(empty);
semkill(full);
shmdt(0);
shmctl(shmid, IPC_RMID, NULL);
}

//consumer process
if(pid == 0)
{
for(i=0;i<N;i++)
{
P(full);
P(mutex); // Entering critical section
consumer();
V(mutex);
V(empty); // Exit from critical section
}
}
}

最佳答案

您正在分离一个 NULL 指针。您需要分离 shmat() 返回的地址。此外,您可能希望在创建段的位置将段标记为销毁,这样 exit 也可以处理分离,这减少了在意外发生时内存limbo'd 的机会。您可能仍应手动分离。

// ...create shared memory segment...

// attach.
buffer = shmat(shmid, 0, 0);
// mark for destruction.
shmctl(shmid, IPC_RMID, 0);

// ...do stuff...

// detach.
shmdt(buffer);

关于c - 使用 shmctl() 销毁共享内存段 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19939588/

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