在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 {

我在C中创建了以下方法来创建一个共享内存段来存储计数器值。但是我不能在这个段中存储数据。当我试图打印计数器的值时,它会给我一个垃圾值。这个代码有什么问题

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。如果您不确定实际需要什么,请遵循我提供的链接。