Articles of 共享内存

从共享内存段中读取和写入信号的地方在哪里?

我已经实现了一个基于共享内存模拟pipe()系统调用的库。 现在,当我没有使用任何fork() ,例如没有调用任何subprocess时,代码工作正常。 我的库需要与任何给定的 int main()程序一起工作,所以这里的基本问题是用信号量进行的修改应该在库中进行,而不是在主程序中进行。 图书馆 : 这是图书馆: static int flag = FALSE; static int mutex_init = 0; static pthread_mutex_t lock; #define BUFFER 4096 int my_new_finish() { return 1; // always successful } void error_out(const char *msg) { perror(msg); exit(EXIT_FAILURE); } 现在,当我不使用调用fork() main时,这个库工作正常。 但是,当我使用fork() ,所有地狱刹车松动。 例如 : #include <stdio.h> #include <stdlib.h> int main() { […]

由shmat()返回的虚拟内存地址指向不同的硬件内存位置

我有两个进程,每个都可以从shmget()获取相同的shmid 。 在这两个进程中, shmat()给出不同的内存地址。 每个进程的地址总是相同的: Process1: 0x41b31000 Process2: 0x4017d000 我不认为这些地址是虚拟地址,正如在下面的问题中所写的答案一样,如果这些地址是虚拟地址,则必须指向相同的硬件地址。 但是,这些地址的内容不一样。 我正在为ARM处理器交叉编译,我的程序在x86 Debian Lenny中运行时没有错误或问题。 我意识到这个问题,但问题不是那么容易 – shmat()为相同的“shmkey”返回不同的“shmaddr” –

对POSIX共享内存对象执行基于文件(基于fd)的访问是否安全?

shm_open返回一个与“共享内存对象”关联的fd 。 通常情况下,这个对象然后映射到虚拟内存(与mmap )作为memory-mapped file访问。 但是 , 通过它的fd来访问共享内存对象是否安全(就像它是一个普通文件一样)? 而通过“安全”,我的意思是POSIX保证有明确的行为? 我问的原因是我正在与第三方接口, 只接受一个fd (而不是一个内存地址)写一个固定的字节数。

共享内存中的Shared_dirty vs Private_dirty

我有使用共享内存的多进程应用程序。 我正在尝试检测我的应用程序中的内存泄漏。 我在/ proc / $ pid / smap中find了这个 2b51cd2b2000-2b53b8aa4000 rw-s 00000000 00:09 17151225 /dev/zero (deleted) Size: 8052680 kB Rss: 31608 kB Shared_Clean: 1524 kB Shared_Dirty: 25736 kB Private_Clean: 0 kB Private_Dirty: 4348 kB Swap: 0 kB Pss: 6945 kB 这是我分配的共享内存(大小告诉这是我用mmap分配的) 我试图理解在这种情况下Shared / Private之间的区别,内存本身是共享的。 看到''的标志。 如果任何人可以解释Shared_Clean与Private_Clean Shared_Dirty与Private_Dirty在共享内存上的区别。

shm_unlink从shell?

我有一个程序,创build一个shm_open ,我正在共享内存对象。 它试图用shm_unlink释放对象,但有时编程错误会导致它在崩溃之前崩溃。 在这种情况下,我需要手动取消共享内存对象的链接,而且我希望能够在普通shell程序中完成,而不用编写任何C代码 – 即使用普通的Linux实用程序。 可以这样做吗? 这个问题似乎是说在/dev/shm/path_passed_to_shm_open上使用unlink(1) ,但manpages不清楚。

通过正在运行的linux C进程的命令行数据打印

这个场景如下(没有可用的代码):一个linux进程永远在(1)循环中运行。 该过程在C / C ++(POSIX)中实现。 该过程将一些数据保存到std :: vector。 myvector.push_back("test1"); myvector.push_back("test1"); myvector.pop_back(); myvector.push_back("test1"); 该过程运行并修改向量。 我正在寻找一种机制,将执行具有特定命令行参数的二进制文件时,将打印vector值。 假设这个过程叫做“myprocess”并且正在运行。 我想从一个新的shell执行相同的二进制文件,如./myprocess -debug,并打印STL容器的值。 任何想法? 什么是最好的机制(即打印另一个进程的内存)

基于共享内存的聊天应用程序出现问题

我正在尝试构build一个应用程序,该应用程序有两个使用共享内存交换消息的进程…我正在做的事情,您将会看到,正在请求共享内存,然后在其中放入一个结构体。 该结构由一个string,Bool标志和一个枚举值组成。string应该保存消息,该标志应该告诉对方是否已经看到这个消息(如果有的话,没有人允许添加消息是在内存中的未读消息)我遇到了几个问题1-我无法达到string的string…. 2-当我用一个intreplacestring,我在客户端时遇到问题去记忆,这是代码… 服务器端: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <iostream> #include <string> #include <sys/wait.h> using namespace std; enum e {Server,Client}; struct chat // struct that will reside in the memory { bool ifread; //boolian variable to determin if the message has been raed or not e who; char message[50]; int msgl; }; int […]

意外的行为与共享内存和分叉?

给出以下代码: #include <sys/types.h> #include <sys/shm.h> #include <stdio.h> #include <sys/types.h> int main() { int arr[100]; int shmid = shmget(IPC_PRIVATE, sizeof(int), 0600); int *ptr = shmat(shmid, NULL, 0); *ptr = 42; arr[0] = 1; if (fork()) { wait(NULL); printf("%d, %d\n",arr[0],*ptr); } else { arr[0] = 2; *ptr = 1337; } return 0; } 输出是: 1,1337 。 问:为什么不是2,1337 […]

C中使用共享内存的IPC

我在C linux中使用共享内存来实现IPC。 这是我的接收过程。 它收到正确的长度,但不是消息。 但发送过程正确地发送它。 请看看这个,让我知道错误。 //header files #include "/home/user/msgbuf.h" #define SHMSZ 127 int main() { int shmid; key_t key; message_buf *rbuf; rbuf=malloc(sizeof(*rbuf)); key = ftok("/home/user/shmem",17); if ((shmid = shmget(key, SHMSZ, 0666)) < 0) { perror("shmget"); exit(1); } printf("\nShared Memory Id = %d\n",shmid); if ((rbuf = shmat(shmid, NULL, 0)) == (message_buf *) -1) { perror("shmat"); […]

共享内存不与C中的进程共享

在尝试解决一些debugging问题时,我在代码中添加了一些printf -s: 我用这个代码: struct PipeShm { int init; sem_t sema; … … } struct PipeShm * sharedPipe = NULL; FUNC2: int func2() { if (!sharedPipe) { int myFd = shm_open ("/myregion", O_CREAT | O_TRUNC | O_RDWR, 0666); if (myFd == -1) error_out ("shm_open"); // allocate some memory in the region in the size of the […]