共享内存例子

共享内存避免同时访问临界资源

https://blog.csdn.net/woyimibayi/article/details/80096275

 

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <signal.h>


void func(int signo)
{

}


int main(void)
{
	int shm_id;
	pid_t pid;
	key_t key;
	char *c_addr,*p_addr;
	key = ftok("/tmp",'a');
  //创建共享内存
	shm_id = shmget(key,1024,IPC_CREAT|0644);
  printf("id:%d\n", shm_id);
  system("ipcs -m");

	pid = fork();

	if(pid == 0)//子进程打印数据
	{    
		signal(SIGUSR1,func);
//映射到具体的进程空间中
		c_addr = shmat(shm_id,NULL,0);
		while(1)
		{
			pause();

			printf("shm string: %s",c_addr);
		}
//撤销映射
		shmdt(c_addr);

	}else if(pid > 0) //父进程
	{
		char buf[BUFSIZ];
//映射到具体的进程空间中
		p_addr = shmat(shm_id,NULL,0);

		while(1)
		{
			fgets(buf,BUFSIZ,stdin);
			if(strncmp(buf,"quit",4) == 0)
			{
				kill(pid,SIGKILL);
				break;
			}
			strcpy(p_addr,buf);
			kill(pid,SIGUSR1);
		}
//撤销映射
		shmdt(p_addr);
	}
	wait(NULL);
//删除共享内存
	shmctl(shm_id,IPC_RMID,NULL);

	return 0;
}



shmget,shmat,shmdt,shmctl

 

命令执行ipcrm -m xxx
或者代码中执行shmctl(shmid, IPC_RMID, NULL);
会禁止对该共享内存的后续引用,但是该内存仍然可以使用,所有进程退出后,才删除该内存
响应的key值也变为0
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x000004d2 688128     root       666        4096       1                       


ipcrm -m xxx后,并且有一个进程在使用这个内存
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 720896     root       666        4096       1          dest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值