共享内存避免同时访问临界资源
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