Linux 1. 奇怪符号 ^@

时间:2021-12-08 06:29:23

最近一直在研究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打开看到是这样的:

Linux 1. 奇怪符号 ^@


可以看到在abc下面多了一个^@字符。这是怎么回事呢?

我发现主要是len的关系,上面我使用的是len=5,我原本的打算是"abc\n"后面还要给'\0'分配一个字符位置,因此len用的是5。结果就是多了一个 ^@ 字符。如果将len改为4,则不会有上面所说的问题,结果如下:


Linux 1. 奇怪符号 ^@