最近一直在研究Linux操作,从内心来说,我觉得这个操作系统很有意思,而且拓宽了我局限于C#的思维模式,Tres bien!
学习过程中也遇到一些各种各样奇怪的问题,网上搜索后好像大家也没有一个确切的说法。因此在这里,我打算把我遇到的比较有意思的问题写在博客中,是自己的思考和实验,希望对大家有益。
本文要讲的就是这个看似奇怪的 ^@ 符号。
先上代码:
#include<stdio.h> #include<fcntl.h> #include<unistd.h> #include<string.h> #include<stdlib.h> #include<sys/mman.h> int main(void) { int fd = open("mytest.txt",O_CREAT|O_RDWR,0644); if(fd<0){perror("open file error\n");exit(-1);} char *p = NULL; int len = 5; int ret = ftruncate(fd,len); //传4个字节 if(ret<0){perror("ftruncate error\n");exit(-1);} p = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(p==MAP_FAILED){perror("mmap error\n");exit(-1);} strcpy(p,"abc\n");//通过指向映射内存区的指针p来操作映射内存空间 ret = munmap(p,len); //释放映射区 if(ret==-1){perror("munmap error\n");exit(-1);} close(fd);//关闭被映射的磁盘空间指针(文件) return 0; }
这段代码主要是通过mmap来实现磁盘映射内存空间的功能。我将"abd\n"这个字符串映射到内存中对应的磁盘空间上(也就是那个mytest.txt文件中),结果用vi打开看到是这样的:
可以看到在abc下面多了一个^@字符。这是怎么回事呢?
我发现主要是len的关系,上面我使用的是len=5,我原本的打算是"abc\n"后面还要给'\0'分配一个字符位置,因此len用的是5。结果就是多了一个 ^@ 字符。如果将len改为4,则不会有上面所说的问题,结果如下: