在C语言中创建共享内存
我在C中创建了以下方法来创建一个共享内存段来存储计数器值。但是我不能在这个段中存储数据。当我试图打印计数器的值时,它会给我一个垃圾值。这个代码有什么问题在C语言中创建共享内存,c,linux,posix,shared-memory,C,Linux,Posix,Shared Memory,我在C中创建了以下方法来创建一个共享内存段来存储计数器值。但是我不能在这个段中存储数据。当我试图打印计数器的值时,它会给我一个垃圾值。这个代码有什么问题 CreateCounter() { key = ftok(".",'B'); shmCntid = shmget(key,COUNTER_SIZE,IPC_CREAT|0666); if(shmCntid == -1 ) { perror("shmget"); exit(1); } else {
CreateCounter()
{
key = ftok(".",'B');
shmCntid = shmget(key,COUNTER_SIZE,IPC_CREAT|0666);
if(shmCntid == -1 )
{
perror("shmget");
exit(1);
}
else
{
printf("Creating new Sahred memory sement\n");
cntPtr = shmat(shmCntid,0,0);
if(cntPtr == -1 )
{
perror("shmat");
exit(1);
}
}
}
在main方法中调用此方法,如下所示
int *cntPtr;
int rowCnt;
sem_t s;
sem_t c;
sem_t r;
int main(int argc, int *argv[])
{
int pid, pid2, pid3, i;
CreateBuf1();
CreateBuf2();
CreateCounter();
GetInput(argv[1],*buf1Ptr);
sem_init(&c, 0, 1);
sem_init(&r, 0, 1);
sem_init(&s, 0, 1);
for( i = 0 ; i < 9; i++)
{
pid = fork();
if(pid < 0)
{
printf("Fork error !\n");
}
else if (pid == 0)
break;
}
if(pid < 0)
{
printf("Fork error !\n");
}
else if (pid == 0)
{
sem_wait(&r);
Grp1 (i,i);
cntPtr+=rowCnt;
sleep(1);
sem_post(&r);
sem_post(&c);
exit(0);
}
else
{
wait(NULL);
}
pid2 = fork();
if(pid2 < 0)
{
printf("Fork error !\n");
}
else if (pid2 == 0)
{
sem_wait(&c);
Grp2(9);
cntPtr+=colCnt;
sleep(1);
sem_post(&c);
exit(0);
}
else
{
wait(NULL);
}
// This space is to print the values..............
shmctl(shmBuf1id,IPC_RMID,0);
shmctl(shmBuf2id,IPC_RMID,0);
shmctl(shmCntid,IPC_RMID,0);
return 0;
}
int*cntPtr;
int rowCnt;
扫描电镜;
扫描电镜;
扫描电镜;
int main(int argc,int*argv[]
{
int-pid,pid2,pid3,i;
CreateBuf1();
CreateBuf2();
CreateCounter();
GetInput(argv[1],*buf1Ptr);
sem_init(&c,0,1);
sem_init(&r,0,1);
sem_init(&s,0,1);
对于(i=0;i<9;i++)
{
pid=fork();
if(pid<0)
{
printf(“分叉错误!\n”);
}
否则如果(pid==0)
打破
}
if(pid<0)
{
printf(“分叉错误!\n”);
}
否则如果(pid==0)
{
sem_wait&r;
Grp1(i,i);
cntPtr+=rowCnt;
睡眠(1);
教统局局长(邮政局局长),;
sem_post&c;
出口(0);
}
其他的
{
等待(空);
}
pid2=fork();
if(pid2<0)
{
printf(“分叉错误!\n”);
}
else if(pid2==0)
{
sem_wait&c;
Grp2(9);
cntPtr+=colCnt;
睡眠(1);
sem_post&c;
出口(0);
}
其他的
{
等待(空);
}
//此空间用于打印值。。。。。。。。。。。。。。
shmctl(shmBuf1id,IPC_RMID,0);
shmctl(shmBuf2id,IPC_RMID,0);
shmctl(shmCntid,IPC_RMID,0);
返回0;
}
您是否尝试过传递绝对路径而不是“
”?除了函数的返回类型已被删除之外,我没有立即在显示的代码中看到错误。请展开代码以演示问题。@KeineLust,据我所知,不需要将绝对路径名与ftok()
一起使用。在任何情况下,如果创建或附加共享内存段时出现问题,那么我希望OP的错误检查会捕获它。@JohnBollinger返回类型为void。这是作为一个单独的方法创建的,只是为了提高主方法的可读性。@Dolittle,我第一个评论的要点是,错误很可能是由程序的某些部分引起的,而不是您所展示的部分。添加函数返回类型几乎不足以创建MCVE。如果您不确定实际需要什么,请遵循我提供的链接。