使用mmap第一个字符是错误的

Using Mmap first character is wrong

我想使用 Mmap 更改 Hello,world! 文件的内容!世界果冻!

输入文件是 Hello.txt,即 1 行 Hello,world! 输出通常是`你好,世界! 输出应该是 Jello,world! 到 运行 程序 pgm.exe hello.txt 1

关键代码行在程序末尾(也许某些东西很关键,我只是不知道)

感谢您的帮助

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

void main(int argc, char *argv[]) {
int     fd, changes, i  ;
struct stat buf;
char        *the_file,
    *starting_string = "Jello,world!";

if (argc != 3) {
    printf("Usage: %s file_name #_of_changes\n", *argv);
    exit(1);
}

if ((changes = atoi(argv[2])) < 1) {
    printf("#_of_changes < 1\n");
    exit(1);
}

if ((fd = open(argv[1], O_CREAT | O_RDWR, 0666)) < 0) {
    printf("open error on file %s\n", argv[1]);
    exit(1);
}

//write(fd, starting_string, strlen(starting_string));

/* Obtain size of file to be mapped */
if (fstat(fd, &buf) < 0) {
    printf("fstat error on file %s\n", argv[1]);
    exit(1);
}

/* Establish the mapping */
if ((the_file = mmap(0, (size_t)buf.st_size, PROT_READ | PROT_WRITE,
    MAP_SHARED, fd, 0)) == (caddr_t)-1){
    printf("mmap failure\n");
    exit(1);
}

printf("The file orginally contains:\n %s \n", the_file);

*(the_file) = "Jello,world!"; 

printf("The file now contains:\n %s \n", the_file);

exit(0);


}

这一行

*(the_file) = "Jello,world!"; 

"Jello,world!" 地址的截断值分配给文件中的第一个字符。

要将单个字符 'J' 分配给该地址,可以这样做:

*(the_file) = 'J';

此外,这一行:

printf("The file orginally contains:\n %s \n", the_file);

是一个等待发生的 SEGV。无法保证您的文件包含以 NUL 结尾的字符串。

不能通过直接赋值来复制数组。

使用memcpy()

如果源和目标都是 nil 终止字符数组(在这种情况下不是真的),您可以使用 strcpy(), strncpy() 或(仅限 bsd)strlcpy().