您的位置 首页 培训

选用mmap完成文件的仿制

includeunistdh>includesystypesh>includestdioh>includestdlibh>includesignalh>includesy

#include

#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc,char *argv[])
{
/*参数检测*/
if(argc < 2)
{
printf(“Error!!”);
exit(-1);
}
/*翻开文件,选用体系函数*/
int fd =open(“/home/gong/program/cprogram/signal12.c”,O_RDONLY);
/*选用mmap完成一般文件到进程虚拟存储器的相关*/
/*也便是将巨细随意的文件以写时复制页的方法完成文件到进程虚拟存储器的映射*/
char * p = (char *)mmap(NULL,atoi(argv[argc-1]),PROT_READ,MAP_PRIVATE,fd,0);
/*将存储器中的数据打印到规范输出流中*/
fprintf(stdout,p);

/*封闭文件描述符*/
close(fd);
exit(0);
}

编译调试:
[gong@Gong-Computer cprogram]$ gcc -g mmapTest.c -o mmapTest
[gong@Gong-Computer cprogram]$ ./mmapTest 4096
#include
#include
#include
#include
#include
#include
#include

#define MAXBUF2048
void hander1(int sig)
{
pid_t pid;
while((pid = waitpid(-1,NULL,0))>0)
{
printf(“Hander reaped child 1”,(int)getpid());
}
if(errno != ECHILD)
{
printf(“Error!!”);
exit(-1);
}
sleep(2);
return ;
}
int main()
{
int i,n;
char buf[MAXBUF];
if(signal(SIGCHLD,hander1)==SIG_ERR)
{
printf(“error!!”);
exit(-1);
}
for(i = 0; i< 3; i++)
{
if(fork() == 0)/*子进程*/
{
printf(“Hellofromchild 2”,(int)getpid());
sleep(1);
exit(0);
}
}
/*父进程处理*/
if((n = read(STDIN_FILENO,buf,sizeof(buf)))<0)
{
printf(“error!!”);
exit(-1);
}
printf(“parent processing input”);
while(1)
;
exit(0);
}
以上的结果表明完成了将一般的文件选用mmap到进程的虚拟存储器的加载。其实选用dbg即可检测是否映射成功,可是选用stdout能够愈加的直观。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/317795.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部