我正在使用shmget在我的Linux项目的进程之间共享数据。
int shmget(key_t key, size_t size, int shmflg);
但是,任何其他程序也可以调用shmget,因此可能会导致键冲突(因为我使用常量作为键来调用shmget,所以必须使用常量而不是生成的键,因为横向进程是单独构建和运行的)。
在shmget中应该使用哪些安全值作为键?
我使用shmget()分配一个共享内存段,然后使用pthread_mutex_init()创建进程间共享的互斥锁。一般来说,这是预期的工作。但是,shmget()偶尔会返回ENOENT。阅读手册页时,这应该只有在shmflg不包含IPC_CREAT时才会发生,但我会将其包含在内。下面是我的代码的一小段:
shmid_ = shmget( MYLOCK_KEY_ID, sizeof(pthread_mutex_t), IPC_CREAT | IPC_EXCL | 0666 );
if ( errno == ENOENT ) {
// This should never occur sin
我有两个共享一个头文件的程序。这个头文件定义了一个包含几个成员的结构。然后是#define:#define STRUCTURE_SIZE sizeof(OUR_STRUCTURE)。
然后在共享内存中使用此结构,并将STRUCTURE_SIZE用作shmget()的size参数。
不幸的是,对于一个程序,STRUCTURE_SIZE最终是20758,而在另一个程序中,它最终是20764。因此,当第二个程序尝试获取共享内存时,shmget()返回EINVAL。
uname -a
Linux machine 2.6.30.10-105.2.23.fc11.i686.PAE #1 SMP Thu F
在运行带有gnuradio3.7块的Python脚本时,我目前有以下错误:
> gr::vmcircbuf_sysv_shm: shmget (2): No space left on device
> gr::vmcircbuf_sysv_shm: shmget (2): No space left on device
> gr::vmcircbuf_sysv_shm: shmget (2): No space left on device
> gr::buffer::allocate_buffer: failed to allocate buffer of size
我正在尝试读取一个文件并将每一行放入共享内存(是的,我知道这不是最实用的方法,但我只能说我必须使用共享内存)。是否可以将这些行读取到共享内存中,以便我可以快速跳转到共享内存中的某一行?
例如,我的文件是:
ABCD
EFGH
IJKL
我可以直接跳到共享内存中的第三行,这样我就可以得到"IJKL“了吗?
我目前正在将它读入内存,如下所示:
key_t key; /* key to be passed to shmget() */
int shmflg; /* shmflg to be passed to shmget() */
int shmid; /
在下面的示例中,我尝试使用shmget为一个整数和10个foo结构分配内存,并试图线性地访问它们。但是,它使用“地址边界错误”错误。
对于一个MacOS系统(但在Linux上应该是相同的),我尝试分配两个数据结构应该占用的确切内存量,并尝试将它们线性地进行字节寻址。
#include <stdio.h>
#include <sys/shm.h>
typedef struct {
int f1;
int f2;
} foo;
int main() {
// Size of memory. Consider, int size to be 4. (4 + 8
我在同一台机器上的两个进程(Linux CPU shmget和朋友)之间实现了IPC,并且我试图最大化这两个进程之间的数据吞吐量:例如,我限制这两个进程只能在同一个x86_64上运行,以便利用硬件缓存。
我的问题是,每个进程在虚拟地址空间中放置共享对象的位置重要吗?例如,将对象映射到两个进程中的相同位置是否有利?为什么或者为什么不?