【问题标题】:Shared Memory in C linux between server and ClientC linux中服务器和客户端之间的共享内存
【发布时间】:2013-12-09 15:42:55
【问题描述】:

我想在客户端-服务器程序之间共享变量。我有服务器和 2 个客户端。我用 shmget 制作了 shm,但我无法在客户端中读取变量

服务器:

if ((nMemID=shmget(kluc, sizeof(udaje[2]), IPC_CREAT|0777))==-1)
{
    perror("Nepodarilo sa vytvorit segment zdielanej pamate\n");
    exit(-100);
}

if ((shared =(udaje *)shmat(nMemID, NULL, 0))==NULL )
{
    fprintf(stderr,"Nepodarilo sa pripojit na rad sprav\n");
    exit(-1);
}
shared->hlavnaNadrz=50000;
shared->nadrz1=1200;

客户:

 if ((zdielanie =(udaje *)shmat(nMemID, NULL, 0))==NULL )
{
    fprintf(stderr,"Nepodarilo sa pripojit na rad sprav\n");
    exit(-1);
}
data=zdielanie->hlavnaNadrz;

【问题讨论】:

  • 无法阅读或无法附加?
  • 无法从 sharedMemor 中读取。但在 ipcs 我创建了共享内存 0x0000162e 62619660 fitz 777 48 1
  • 如果您的客户端和服务器程序将通过网络进行通信,那么在进程之间共享内存是行不通的。由于内存是在您的服务器上分配的,而不是在您的客户端上。
  • 运行这段代码会发生什么?描述任何关于环境的特别之处。另外,客户端和服务器都在同一台主机上,对吧?无法跨网络共享内存。
  • 注意,shmat() 在失败时返回 -1 而不是 NULL。

标签: c++ c linux shared-memory shared


【解决方案1】:

读取for循环中的数据:

    if (shmctl(shmid, SHM_LOCK, NULL) == -1)
    {
        printf ("Unable to lock the shared storage: Reason %s\n", strerror(errno));
        break;
    }
    ShrStruct = (struct SharedStruct *)shm;
    if (strlen(ShrStruct->Name) && ShrStruct->EmpID != 0)
    {
        printf("Data Received : Name --> %s || Employee ID --> %ld\n", ShrStruct->Name, ShrStruct->EmpID);
        memset(shm, '\0', sizeof(struct SharedStruct));
    }
    if (shmctl(shmid, SHM_UNLOCK, NULL) == -1)
    {
        printf ("Unable to unlock the shared storage: Reason %s\n", strerror(errno));
        break;
    }

【讨论】:

  • 它现在无需解锁即可工作...我只在 shmat 之前将 shmget 添加到我的客户端,它解决了问题。
猜你喜欢
  • 2020-03-22
  • 2018-05-13
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2016-12-04
  • 2015-08-07
  • 2020-05-16
相关资源
最近更新 更多