工作需要,和大家共同学习总结。(学习的内容为传智播客linux服务器开发二、三部分)
共享内存:
1、mmap创建映射区
0644->即用户具有读写权限,组用户和其它用户具有只读权限;
#include<unistd.h>
#include<cstdlib>
#include<iostream>
#include<sys/wait.h>
#include<fcntl.h>
#include<sys/mman.h>
#include <string.h>
using namespace std;
int main(int argc,char * argv[]){
int fd =open("test.txt",O_CREAT|O_RDWR,0644);
char *p=NULL;
if(fd<0){
perror("open error");
exit(1);
}
int len = ftruncate(fd,4);
if(len==-1){
perror("ftruncate error");
exit(1);
}
p= (char *)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(p==MAP_FAILED){
perror("mmap failed");
exit(1);
}
strcpy(p,"abc");//写数据
int ret=munmap(p,4);
if(ret==-1){
perror("munmap failed");
exit(1);
}
close(fd);
return 0;
}
2、利用共享内存在父子进程间通信
#include<unistd.h>
#include<cstdlib>
#include<iostream>
#include<sys/wait.h>
#include<fcntl.h>
#include<string>
#include<sys/mman.h>
#include <string.h>
using namespace std;
int var=100;
int main(int argc,char * argv[]){
int * p;
pid_t pid;
int fd =open("temp",O_CREAT|O_RDWR|O_TRUNC,0644);
if(fd<0){
perror("open error");
exit(1);
}
unlink("temp");//删除临时文件目录项,使之具备被释放条件
int len = ftruncate(fd,4);
if(len==-1){
perror("ftruncate error");
exit(1);
}
p= (int *)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(p==MAP_FAILED){
perror("mmap failed");
exit(1);
}
close(fd);
pid=fork();
if(pid==0){
*p=2000;
var=1000;
cout<<"child,*p="<<*p<<"var="<<var<<endl;
}else{
sleep(1);
cout<<"parent,*p="<<*p<<"var="<<var<<endl;
wait(NULL);
int ret=munmap(p,4);//释放映射区
if(ret==-1){
perror("munmap failed");
exit(1);
}
}
return 0;
}
3、匿名映射
#include<unistd.h>
#include<cstdlib>
#include<iostream>
#include<sys/wait.h>
#include<fcntl.h>
#include<string>
#include<sys/mman.h>
#include <string.h>
using namespace std;
int var=100;
int main(int argc,char * argv[]){
int * p;
pid_t pid;
p= (int *)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,-1,0);
if(p==MAP_FAILED){
perror("mmap failed");
exit(1);
}
pid=fork();
if(pid==0){
*p=2000;
var=1000;
cout<<"child,*p="<<*p<<"var="<<var<<endl;
}else{
sleep(1);
cout<<"parent,*p="<<*p<<"var="<<var<<endl;
wait(NULL);
int ret=munmap(p,4);//释放映射区
if(ret==-1){
perror("munmap failed");
exit(1);
}
}
return 0;
}
4、非血缘关系进程通信
strace file 追踪文件运行当中执行的系统调用