<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        采用mmap實現文件的復制

        作者:公平   來源:本站原創   點擊數:  更新時間:2014年03月14日   【字體:


        #include<unistd.h>
        #include<sys/types.h>
        #include<stdio.h>
        #include<stdlib.h>
        #include<signal.h>
        #include<sys/mman.h>
        #include<string.h>
        #include<fcntl.h>
        #include<sys/stat.h>

        int main(int argc,char *argv[])
        {
                /*參數檢測*/
                if(argc < 2)
                {
                        printf("Error!!\n");
                        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<stdio.h>
        #include<stdlib.h>
        #include<unistd.h>
        #include<sys/types.h>
        #include<sys/wait.h>
        #include<signal.h>
        #include<errno.h>

        #define MAXBUF 2048
        void hander1(int sig)
        {
        pid_t pid;
        while((pid = waitpid(-1,NULL,0))>0)

        printf("Hander reaped child 1\n",(int)getpid());
        }
        if(errno != ECHILD)
        {
        printf("Error!!\n");
        exit(-1);
        }
        sleep(2);
        return ;
        }
        int main()
        {
        int i,n;
        char buf[MAXBUF];
        if(signal(SIGCHLD,hander1)==SIG_ERR)

        printf("error!!\n");
        exit(-1);
        }
        for(i = 0; i< 3; i++)
        {
        if(fork() == 0) /*子進程*/
        {
        printf("Hello from child 2\n",(int)getpid());
        sleep(1);
        exit(0);
        }
        }
        /*父進程處理*/
        if((n = read(STDIN_FILENO,buf,sizeof(buf)))<0)

        printf("error!!\n");
        exit(-1);
        }
        printf("parent processing input\n");
        while(1)
        ;
        exit(0);
        }
        以上的結果表明實現了將普通的文件采用mmap到進程的虛擬存儲器的加載。其實采用dbg即可檢測是否映射成功,但是采用stdout可以更加的直觀。
         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮