shmget returns 相同密钥的不同 id

shmget returns different id for same key

您好,我在 Linux 中制作了小型 'client-server' 文件传输程序。但是奇怪的事情正在发生。如果我启动第一个客户端然后服务器一切正常。 shmget() 为提供的密钥提供相同的 ID。不幸的是,如果我先启动服务器,然后启动客户端,我在客户端中会得到不同的 ID,并且我无法复制数据。 我正在使用 IPC_CREAT 标志,因此它应该加入共享内存。

客户端

id=shmget(138134,1,0777|IPC_CREAT);

服务器

id=shmget(138134,1,0777|IPC_CREAT);

客户端

服务器

基本信息 所以基本上有 3 个元素的信号量。服务器 | sem0 |共享内存 | sem1 |客户。当服务器和客户端发现 EOF 时使用 Sem2。我一个字符一个字符地复制数据。客户端和服务器都具有相同的功能。创建,删除等有基本的信号量和共享内存功能。唯一的区别在于main。不幸的是代码是波兰语,但也许它会有所帮助。

主服务器

utworz_nowy_semafor();//semaphore creating
    upd(); //shared memory creating
    upa(); //shared memory attaching
    odlaczenie1=shmctl(pamiec,IPC_RMID,0); //marking shared memory to delete(waiting for detach)
    FILE* we = fopen("zrodlo", "r");
    if(we == NULL)
    {
        printf("Blad otwierania pliku wejsciowego");
        exit(1);
    }
    else
    {
        printf("Otworzony plik wejsciowy\n");
    }
    int c;
    semafor_v(0); // opening the gate
    while((c = fgetc(we)) != EOF)
    {
        semafor_p(0); // closing the gate
        wstaw(c);
        semafor_v(1);
    }
 semafor_p(0);
    wstaw(c);
    semafor_v(1);
    fclose(we);
    printf("Zamknalem pilk zrodlowy! Czekam na sygnal od konsumenta aby zakonczyc dzialanie$
    semafor_p(2);
    printf("Konsument skonczył kopiowanie. Zamykam program!\n");
    odlaczenie2=shmdt(adres);
    if (odlaczenie1==-1 || odlaczenie2==-1)
      {
        printf("Problemy z odlaczeniem pamieci dzielonej.\n");
        exit(EXIT_FAILURE);
      }
    else printf("Pamiec dzielona zostala odlaczona.\n");
    //odlacz_pamiec();
    exit(EXIT_SUCCESS);

客户端主

utworz_nowy_semafor();
    upd();
    upa();
    FILE* wy; wy = fopen("wynik", "w");
    if(wy == NULL)
    {
        printf("Blad tworzenia pliku");
        exit(1);
    }
    else
    {
        printf("Plik wynikowy utworzony!\n");
    }
    while(1 != 0)
    {
         semafor_p(1);
         char c = wez();
         if(c == EOF)
         {
              printf("Nastąpił koniec pliku. Wykonuję przerwanie petli\n");
              fclose(wy);
              break;
         }
         fputc(c, wy);
         printf("Konsument odebral znak: %c\n",c);
         semafor_v(0);
    }
    semafor_v(2);
    usun_semafor();
    odlaczenie1=shmctl(pamiec,IPC_RMID,0);
    odlaczenie2=shmdt(adres);
    if (odlaczenie1==-1 || odlaczenie2==-1)
     {
        printf("Problemy z odlaczeniem pamieci dzielonej.\n");
        exit(EXIT_FAILURE);
     }
        else printf("Pamiec dzielona zostala odlaczona.\n");

    exit(EXIT_SUCCESS);

已修复:我无法将信号量标记为分离,直到客户端加入它