共享内存2.0(shmget,shmat函数)

本文通过两个实例演示了如何使用共享内存进行进程间通信。首先,一个进程创建共享内存并读取其中的数据;随后,另一个进程将字符串写入该共享内存。此过程展示了共享内存的基本操作,包括创建、读取和写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include"common.h"

int main()
{
	int id;
	int key=getpid();
	id=shmget(key,100,0666|IPC_CREAT);//创建共享内存,注意读写权限
	printf("id = %d\n",id);
	sleep(10);
	char buf[30];
	char *p=shmat(id,NULL,0);//获取共享内存起始地址
	memcpy(buf,p,30);
	printf("buf = %s\n",buf);

}

 

#include"common.h"

int main()
{

		printf("input id..\n");
		int id;
		scanf("%d",&id);
		char buf[]="abcdefghijk";
		char *p=shmat(id,NULL,0);//获取共享内存起始地址
		memcpy(p,buf,sizeof(buf));
		printf("buf = %s\n",p);
}

结果:

 

 

### 创建共享内存的C语言示例 为了创建并访问共享内存,在C程序中通常会使用`ftok()`来生成键值,接着利用此键通过`shmget()`获取或创建一个共享内存段,最后调用`shmat()`将该段附加到当前进程中。 #### 使用 `ftok()`, `shmget()`, 和 `shmat()` 的具体实现如下: ```c #include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> /* ftok */ #include <sys/shm.h> /* shmget, shmat */ #define SHM_KEY_PATH "/tmp" #define PROJ_ID 'A' int main() { key_t key; int shmid; char *data; // Generate a unique key for IPC objects. if ((key = ftok(SHM_KEY_PATH, PROJ_ID)) == -1) { perror("Failed to generate key"); exit(EXIT_FAILURE); } // Create or get an existing shared memory segment associated with the key. if ((shmid = shmget(key, 1024, 0644 | IPC_CREAT)) == -1) { perror("Shared memory creation failed"); exit(EXIT_FAILURE); } // Attach the shared memory segment to this process's address space. data = (char*)shmat(shmid, NULL, 0); if(data == (char *)(-1)){ perror("Attach operation failed"); exit(EXIT_FAILURE); } printf("Data attached at %p\n", data); strcpy(data,"Hello Shared Memory"); // Detach from shared memory when done. if(shmdt(data)==-1){ perror("Detach operation failed"); exit(EXIT_FAILURE); } return 0; } ``` 上述代码展示了如何初始化共享内存区,并向其中写入字符串。这里需要注意的是,当完成对共享内存的操作之后应当显式地将其分离[^1]。 #### 关于共享内存管理的一些注意事项 - 当多个进程需要通信时可以共同访问同一块由`shmget()`返回ID所代表的共享内存区域。 - 如果指定了`(void *)0`作为第二个参数传递给`shmat()`函数,则操作系统会选择合适的地址空间位置来进行映射;这通常是推荐的做法除非有特殊需求。 - 对于不再使用的共享内存应该及时销毁它以释放资源,可以通过`shmctl()`接口指定删除操作来达到目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值