1. 程式人生 > >黑馬《linux系統程式設計》學習筆記(從41到45)

黑馬《linux系統程式設計》學習筆記(從41到45)

四十一. 使用mmap讀取磁碟檔案內容

這裡是mmap.c

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


int main(int argc, const char* argv[])
{
    int fd = open("english.txt", O_RDWR);
    if(fd == -1)
    {
        perror("open error");
        exit(1);
    }

    // get file length
    // len > 0
    int len = lseek(fd, 0, SEEK_END);

    void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if(ptr == MAP_FAILED)
    {
        perror("mmap error");
        exit(1);
    }
    // 從記憶體中讀資料
    printf("buf = %s\n", (char*)ptr);

//    ptr++;
    munmap(ptr, len);
    char buf[4096];

    return 0;
}

 四十二. mmap注意事項

 

 

 四十三. 使用mmap進行有血緣關係的程序間通訊

 

 mmap_parent_child.c

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


int main(int argc, const char* argv[])
{
    int fd = open("english.txt", O_RDWR);
    if(fd == -1)
    {
        perror("open error");
        exit(1);
    }

    // get file length
    // len > 0
    int len = lseek(fd, 0, SEEK_END);

    void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if(ptr == MAP_FAILED)
    {
        perror("mmap error");
        exit(1);
    }
    close(fd);

    // 建立子程序
    pid_t pid = fork();
	if(pid== -1)
	{
		perror("fork error");
		exit(1);
	}
	if(pid>0)
	{
		//寫資料
		strcpy((char*)ptr,"你是我的兒子嗎?");
		//回收
		wait(NULL);
	}
	else if(pid ==0)
	{
		//讀資料
		printf("%s\n",(char*)ptr);
	}
		

//    ptr++;
    int ret = munmap(ptr, len);
    if(ret == -1)
    {
        perror("munmap error");
        exit(1);
    }

    return 0;
}

mmap的優勢,在於資料是在記憶體,而非在磁盤裡進行處理的

 四十四. 建立匿名對映區

接下來,是anon_mmap.c

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


int main(int argc, const char* argv[])
{

	//建立匿名記憶體對映區
	int len = 4096;
	//注意這裡的引數的變化,
    void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
    if(ptr == MAP_FAILED)
    {
        perror("mmap error");
        exit(1);
    }
    close(fd);

    // 建立子程序
    pid_t pid = fork();
	if(pid== -1)
	{
		perror("fork error");
		exit(1);
	}
	if(pid>0)
	{
		//寫資料
		strcpy((char*)ptr,"你是我的兒子嗎?");
		//回收
		wait(NULL);
	}
	else if(pid ==0)
	{
		//讀資料
		printf("%s\n",(char*)ptr);
	}
		

//    ptr++;
    int ret = munmap(ptr, len);
    if(ret == -1)
    {
        perror("munmap error");
        exit(1);
    }

    return 0;
}

 相比較於前面,主要是加了MAP_ANON, 以及fd的位置用-1.

相當於父程序在記憶體中寫了一句話,子程序在記憶體裡讀了出來。

 

四十五. mmap沒有血緣關係的程序間通訊思路