用Ubuntu编写程序,共享内存实现两个进程间的通信
时间: 2024-02-01 13:15:40 浏览: 88
基于有名管道的进程间通信实验报告
5星 · 资源好评率100%
共享内存是一种进程间通信(IPC)的方法,可以让不同的进程共享同一块内存空间,从而实现数据的交换。下面是一个简单的例子,展示了如何在Ubuntu上使用共享内存实现进程间通信。
首先,我们需要创建一个共享内存区域。这可以通过调用系统调用shmget()来完成。shmget()函数的原型如下:
```
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
```
其中,key是共享内存区的键值,size是共享内存区的大小,shmflg是标志位,用于指定共享内存区的访问权限等信息。如果共享内存区已经存在,则返回它的标识符;否则,就创建一个新的共享内存区并返回其标识符。
接下来,我们需要将共享内存区附加到进程的地址空间中。这可以通过调用系统调用shmat()来完成。shmat()的原型如下:
```
void *shmat(int shmid, const void *shmaddr, int shmflg);
```
其中,shmid是共享内存区的标识符,shmaddr是共享内存区附加到进程地址空间中的地址,shmflg是标志位,用于指定附加方式等信息。如果附加成功,则返回共享内存区的起始地址;否则,返回-1。
最后,我们可以在两个进程之间传递数据。这可以通过读写共享内存区来完成。当一个进程写入数据时,另一个进程就可以从共享内存区中读取这些数据。注意,为了避免数据竞争等问题,我们需要对共享内存区进行同步操作。
下面是一个示例代码,演示了如何使用共享内存在两个进程之间传递一个整数:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
int shmid;
key_t key = 1234;
int *data;
//创建共享内存区
if ((shmid = shmget(key, sizeof(int), IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
//附加共享内存区到进程地址空间
if ((data = shmat(shmid, NULL, 0)) == (int *) -1) {
perror("shmat");
exit(1);
}
//向共享内存区写入数据
*data = 42;
//从共享内存区读取数据
printf("The value is %d\n", *data);
//解除共享内存区的附加
if (shmdt(data) == -1) {
perror("shmdt");
exit(1);
}
//删除共享内存区
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
return 0;
}
```
在这个例子中,我们创建了一个大小为sizeof(int)的共享内存区,并将其附加到进程地址空间中。然后,我们向共享内存区写入一个整数42,并从共享内存区中读取这个整数。最后,我们解除共享内存区的附加,并删除它。
阅读全文