- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试学习 IPC UNIX API,特别是共享内存。我已经创建了这个试图访问共享内存段或创建共享内存段的小程序。
这是我的做法:
gcc -Wall -Wextra *.c
# in one terminal
./a.out
# in another
/a.out
您可以在源代码中看到的 shared.mem
文件存在于我启动可执行文件的同一目录中。
但是,似乎我实际上从未访问过以前创建的共享内存段(错误是“没有这样的文件或目录”)。我总是创建一个新的 - 正如通过 ipcs
命令行 看到的那样,即使 IPC key 保持不变。
我做错了什么?
下面是我使用的代码,供引用。它至少可以在 Linux 上编译。
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define exit_error(what) exit_error_func(what, __FILE__, __LINE__)
#define SHM_SIZE (64)
#define UNUSED(x) (void)(x)
void *shm_addr = NULL;
void exit_error_func(const char *what, const char *file, int line)
{
fprintf(stderr, "Error in %s at line %d: %s. Reason: %s.\n", file, line, what, strerror(errno));
exit(1);
}
void sigint_handler(int sig)
{
shmdt(shm_addr);
UNUSED(sig);
}
int main(void)
{
key_t ipc_key;
int shm_id;
if ((ipc_key = ftok("shared.mem", 1)) == -1)
exit_error("could not get IPC key");
printf("IPC key is %d\n", ipc_key);
if ((shm_id = shmget(ipc_key, SHM_SIZE, 0600)) == -1)
{
printf("could not get SHM id, trying to create one now\n");
if ((shm_id = shmget(ipc_key, SHM_SIZE, IPC_EXCL | IPC_CREAT | 0600)) == -1)
exit_error("could not create or get shared memory segment");
else
printf("created SHM id\n");
}
else
printf("got already existing SHM id\n");
printf("SHM id is %d\n", shm_id);
if ((shm_addr = shmat(shm_id, NULL, 0)) == (void *)-1)
exit_error("could not attach to segment");
signal(SIGINT, sigint_handler);
if (shmctl(shm_id, IPC_RMID, NULL) == -1)
exit_error("could not flag shared memory for deletion");
printf("SHM flagged for deletion\n");
while (1)
sleep(1);
return (0);
}
最佳答案
似乎无法shmget
标记为删除的共享内存段。因此,一旦没有进程需要 shmget
共享内存段就必须标记为删除。
免责声明:我不是 UNIX 专家。尽管建议的解决方案对我有用,但我仍在学习,无法保证此处提供的信息的准确性。
关于linux - shmget 先前创建的内存段失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876743/
我有这段代码: if ((shmid = shmget(key, 512, IPC_CREAT | 0666)) 之后,您应该可以将其创建得更大一些。 关于c++ - shmget 大小限制问题,我
我正在尝试学习 IPC UNIX API,特别是共享内存。我已经创建了这个试图访问共享内存段或创建共享内存段的小程序。 这是我的做法: gcc -Wall -Wextra *.c # in one t
#include #include #include #include #include #include #include int main() { int i=0;
我正在编写一个简单的程序来分配共享内存,下面是shmget的示例代码, #define SHM_SIZE 1024 main(int argc,char **argv) { int s
我正在绞尽脑汁地想弄清楚为什么这在我的 Minix 系统上不起作用。 当我尝试编译 C 程序时,出现以下错误: #make link pm/pm program.o: In funct
int shmCreate(int id, int size) { int shmid key_t key; if ((key = ftok(".", id)) == -1)
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在尝试创建两组共享内存段。一个用于存储整数,另一个用于存储字符串。当我为我的整数创建共享内存段时,我在第二次 shmget 调用中不断收到错误消息。 keyS=5678; keyI=6789;
当我在下面的代码中运行 shmget 时,它返回一个值 -1,我不确定为什么会这样。其他一切似乎都运行良好。该代码只是应该从命令行获取几位数字,然后为它们创建共享内存。数字范围从 0 到 9。 #in
我创建了两个进程。其中一个创建共享内存块,另一个尝试读取它。此代码没有编译错误,但不知何故进程 2 的行为很奇怪。 过程 1: #include #include #include #inclu
我尝试将 shmget 与二维数组一起使用。这是我的代码: char **array; key_t key; int size; int shm_id; int i = 0; void *addr;
HugeTLB - Large Page Support in the Linux Kernel #include #include #include #include #define MB_
我正在使用 shmget 在我的 Linux 项目进程之间共享数据。 int shmget(key_t key, size_t size, int shmflg); 但是,任何其他程序也可以调用shm
在生产者流程中,我有以下内容。 说 MEMKEY 为 key_t 234500,并且 *shared_ring 是指向正在共享的数据结构 (donut_ring) 的指针。 int shmid, se
我需要一些有关此代码的帮助。 我在共享段中创建了一个struct msg_t,并在另一个段中创建了一个简单的字符串。在此方法中,首先附加两个段,然后要初始化字符串。然后我尝试将指向该字符串的指针(在第
使用以下参数调用: shmget(IPC_PRIVATE, sizeof(int), 0600); 我正在尝试确定将分配多少字节给共享内存块? 我认为它与 PAGE_SIZE 有关(在 32 位操作系
int shmid; int* locat; //create shared memory segment shmid = shmget(6666, size, 0666); if (shmid <
我有一个关于 C 中的 shmget() 函数的快速问题。该程序非常简单。它要求用户输入一个 shmid,然后输出 key 、模式、所有者等。 我正在使用 buffer->shm_perm.mode
在下面的示例中,我尝试使用 shmget 为 1 个整数和 10 个 foo 结构 分配内存并尝试线性访问它们。但是,它会因“地址边界错误”而出错。 对于 MacOS 系统(但在 Linux 上应该相
好的,所以我有一个字符串数组 char array[4][20]; //initialized strcpy(array[0], "PERSON1"); strcpy(array[1], "PERSO
我是一名优秀的程序员,十分优秀!