我正在审查一些代码,并对使用的技术感到怀疑.
在Linux环境中,有两个进程连接多个共享内存段.第一个进程定期加载要共享的新文件集,并将共享内存id(shmid)写入"master"共享内存段中的某个位置.第二个过程不断读取此"主"位置,并使用shmid附加其他共享段.
在多CPU主机上,在我看来,如果一个进程在被另一个进程写入时尝试读取内存,可能会依赖于实现.但也许硬件级总线锁定可以防止线路上的损坏位?如果读取过程得到一个很快就要改变的值,那么只要读取被破坏为既不是旧值也不是新值的东西也是无关紧要的.这是一种边缘情况:只有32位被写入和读取.
谷歌搜索shmat的东西并没有让我在这方面做出任何明确的决定.
我强烈怀疑它不安全或理智,而我真正喜欢的是指向详细描述问题的文章的一些指示.
监视器应该解决并发环境中信号量的问题.
我正在寻找使用监视器和信号量的一个很好的比喻.
请使用类比信息:
4个任务(TaskA,TaskB,TaskC,TaskD)
1个变量varX
每个任务都想根据某个事件操作varX.
简而言之,我的问题是:如果您有class,则MyClass<T>如何更改类定义以支持您拥有的情况MyClass<T, Alloc>,类似于STL vector提供的方式。
我需要此功能来支持共享内存的分配器。具体来说,我正在尝试在共享内存中实现环形缓冲区。当前它具有以下ctor:
template<typename ItemType>
SharedMemoryBuffer<ItemType>::SharedMemoryBuffer( unsigned long capacity, std::string name )
Run Code Online (Sandbox Code Playgroud)
在哪里ItemType是要放置在缓冲区的每个插槽中的数据的类型。
现在,当我从主程序创建缓冲区时,效果如此出色
SharedMemoryBuffer<int>* sb;
sb = new SharedMemoryBuffer<int>(BUFFER_CAPACITY + 1, sharedMemoryName);
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,缓冲区本身不会在共享内存中创建,因此其他进程无法访问该缓冲区。我想做的是能够做类似的事情
typedef allocator<int, managed_shared_memory::segment_manager> ShmemAllocator;
typedef SharedMemoryBuffer<int, ShmemAllocator> MyBuffer;
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
const ShmemAllocator alloc_inst (segment.get_segment_manager());
MyBuffer *mybuf = segment.construct<MyBuffer>("MyBuffer")(alloc_inst);
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何向类模板添加显式分配器。
我有2个共享头文件的程序.此头文件定义具有少量成员的结构.然后是#define : #define STRUCTURE_SIZE sizeof(OUR_STRUCTURE).
然后,此结构在共享内存STRUCTURE_SIZE中用于size参数shmget().
不幸的是,对于一个程序,STRUCTURE_SIZE最终为20758,而在另一个程序中,它最终为20764.所以当第二个程序试图获取共享内存时,shmget()返回EINVAL.
uname -a:
Linux machine 2.6.30.10-105.2.23.fc11.i686.PAE #1 SMP Thu Feb 11 07:05:37 UTC 2010 i686 i686 i386 GNU/Linux
g++ --version:
g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)
我试图创建一块共享内存以共享一个数组,这是我的例子:
int main(){
key_t key;
int shm_id;
int arr[10];
key=ftok("~/.bashrc",1);
shm_id = shmget(key, 10*sizeof(int), 0666 | IPC_CREAT);
arr = (int*)shmat(shm_id, NULL, 0);
arr[0]=101;
printf("%d\n",arr[0]);
}
Run Code Online (Sandbox Code Playgroud)
编译时,我收到以下错误:
error: incompatible types in assignment of ‘int*’ to ‘int [10]’
Run Code Online (Sandbox Code Playgroud)
我的任务有什么问题?
我有一个包含两个进程和两个文件的程序,我想用共享内存读取第二个文件的代码的var,但我只得到"测试"字,而不是文本.程序的第一个文件的代码:
a=shmget(key, 200, 0666|IPC_CREAT);
text=(char *)shmat(a,0,0);
text=&words[0];
if ((P2=fork())==1)
{
perror("fork");
exit(-1);
}
if (P2==0)
{
execl("prog2","prog2",NULL);
}
Run Code Online (Sandbox Code Playgroud)
和第二个文件的代码:
a=shmget(key, 200, 0666);
text=shmat(a,0,SHM_RDONLY);
printf("testing, %s", text);
Run Code Online (Sandbox Code Playgroud)
任何的想法?谢谢.
我有以下C程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
int main()
{
key_t shm_key;
int shm_flag,shm_id,shm_size;
void *shm_addr;
shm_key = ftok("/home/meow/Arena",22);
perror("SHMKEY");
shm_id = shmget(shm_key,sizeof(int)*20,IPC_CREAT);
perror("SHMGET");
shm_addr = shmat(shm_id,NULL,0);
perror("SHMAT");
}
Run Code Online (Sandbox Code Playgroud)
当没有root权限执行时
meow@darkArts ~/Arena/c $ gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Permission denied
Run Code Online (Sandbox Code Playgroud)
当由root用户执行时,我得到以下消息
root@darkArts:/home/meow/Arena/c# gcc shm.c && ./a.out
SHMKEY: Success
SHMGET: Success
SHMAT: Success
Run Code Online (Sandbox Code Playgroud)
是否可以在没有root特权的情况下将共享内存绑定到我的地址空间?
shmid = shmget(key, SHMSZ, IPC_CREAT | 0666);和shmid = shmget(key, SHMSZ, IPC_CREAT | 0777);我得到
meow@darkArts ~/Arena/c $ …Run Code Online (Sandbox Code Playgroud) 我正在研究一种每秒需要大约20兆的数据的嵌入式系统.我的低级采集,控制和处理层将其中的大部分转换为少数几个重要值,但它也可以帮助最终用户查看未处理数据的窗口.
我正在使用mod-mono在C#中使用ASP.NET前端.我希望ASP.NET页面的服务器端部分能够轻松地请求最后半秒左右的数据.C++代码具有实时约束,因此我不能使用消息传递来响应 - 它可能很容易被太多客户端或快速刷新的人所困扰.我希望它能够将数据放置在任何数量的C#读者可以根据需要访问它的地方.
我正在想象一个共享内存区域,其中包含至少16或32MB数据的滚动缓冲区.C++代码不断更新它,C#代码可以随时查看它.有办法处理这个吗?我在使用内存映射文件时发现的所有信息似乎都集中在分支一个孩子,而不是让两个不相关的进程将它用于IPC - 它是否必须在C#应用程序看到之前到达磁盘(或fs缓存等)它,或两个程序的内存映射实际上使它们共享相同的页面?
有没有办法在C#中访问POSIX共享内存对象?
我正面临着一个同步问题,我正在尝试解决的问题包括将字符串从父节点发送到子节点,将其反转并将其发送回子节点(使用共享内存).
然而,为了确保孩子在等待父母我使用sleep(3)给3秒到父进程进入串,然而这限制我的程序的效率,我不想强迫用户等待3秒.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/wait.h> /* Needed for the wait function */
#include <unistd.h> /* needed for the fork function */
#include <string.h> /* needed for the strcat function */
#define SHMSIZE 27
int main() {
int shmid;
char *shm;
if(fork() == 0) {
sleep(3);
shmid = shmget(29009, SHMSIZE, 0);
shm = shmat(shmid, 0, 0);
printf ("Child : Reading %s \n",shm) ;
int len=strlen(shm);
char rev[100],temp;
int i = …Run Code Online (Sandbox Code Playgroud) 这是一个foo.c将数据写入共享内存的程序.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
key_t key;
int shmid;
char *mem;
if ((key = ftok("ftok", 0)) == -1) {
perror("ftok");
return 1;
}
if ((shmid = shmget(key, 100, 0600 | IPC_CREAT)) == -1) {
perror("shmget");
return 1;
}
printf("key: 0x%x; shmid: %d\n", key, shmid);
if ((mem = shmat(shmid, NULL, 0)) == (void *) -1) {
perror("shmat");
return 1;
}
sprintf(mem, "hello");
sleep(10);
sprintf(mem, …Run Code Online (Sandbox Code Playgroud)