c - shmget中没有这样的文件或目录错误

标签 c ubuntu ipc shared-memory

我在 Ubuntu 上用 C 实现了共享内存概念。我创建了两个文件 server.c 和 client.c ,首先我编译了 server.c 然后编译了 client.c 并运行它。但它显示了一个错误。 “没有这样的文件或目录” 此错误出现在 client.c 文件中,因为未找到请求的共享内存段。请帮助我如何解决这个问题。

这是我的代码

服务器.c

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

  #define SHMSIZE 100

 int main()
 {

 int shmid;
 key_t key;
 char *shm, *s;

 key=9876;
 shmid=shmget(key,SHMSIZE,IPC_CREAT|0666);
 if(shmid<0)
 {
 printf("%s",strerror(errno));
 perror("Error in Shared Memory get statement");
 exit(1);
 }

 shm=shmat(shmid,NULL,0);
 if(shm== (char *) -1)
 {
 perror("Error in Shared Memory attachment");
 exit(1);
 }

 memcpy(shm,"Hello World",11);
 s=shm;
 s+=11;

 while(*shm!='*')
 {
 sleep(1);
 }

 return 0;
 }

客户端.c

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

#define SHMSIZE 100

int main()
{

 int shmid;
 key_t key;
 char *shm, *s;

 key=9876;
 shmid=shmget(key,SHMSIZE,0666);
 if(shmid<0)
 {
 printf("%s",strerror(errno));
 perror("Error in Shared Memory get statement");
 exit(1);
 }

 shm=shmat(shmid,NULL,0);
 if(shm== (char *) -1)
 {
 printf("%s",strerror(errno));
 perror("Error in Shared Memory attachment");
 exit(1);
 }

 for(s=shm; *s!=0;s++)
 {
 printf("%c",*s);
 }
 printf("\n");
 *shm='*';
 return 0;
 }

最佳答案

事实上,shmget() 失败并显示“没有这样的文件或目录”仅意味着它没有找到具有该键的段(现在迂腐:不是 id - 对于 id,我们通常指的是由shmget(),随后使用) - 您检查过 shmid 是否相同?你的代码在我的系统上运行良好。

刚刚在它周围添加了一个 main() 。希望对您有帮助。

 key=9876;
 shmid=shmget(key,SHMSIZE,0666);
 if(shmid<0)
 {
        printf("%s",strerror(errno));
        perror("Error in Shared Memory get statement");
        shmid = shmget(key, SHMSIZE, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH | IPC_CREAT);
        if (shmid == -1)  {
                printf("%s",strerror(errno));
                perror("Error in Shared Memory get statement");
                exit(1);
        }
 }
printf("Shmget() successful %d\n",shmid);

关于c - shmget中没有这样的文件或目录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41234677/

相关文章:

c - 为什么扩展 TCL 示例不起作用?

c - 将一组动态的可变参数传递给 C 函数

c - 有没有办法在 POSIX 线程中到达 ‘join’ (阻止),而不退出加入者?

c# - 将数据从 C# 传递到 Electron

gcc 开关盒组装中的困惑

ubuntu - Vim 中的 mod 键是什么,我可以将 Win 键分配给 Vim 的 mod 键吗?

python - Gtk警告: could not open display

ubuntu - 循环获取 'checking flume.conf for changes'

c++ - 如何在控制台应用程序中使用仅消息窗口接收消息?

perl - perlipc 文档中的错误?