gpt4 book ai didi

c - gets 和 mmap 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:05 24 4
gpt4 key购买 nike

我有老师提供的这段代码,它打开一个文件,用mmap映射到内存,然后用gets写一个字符串。问题是它只将字符串的前 2 个字符写入文件,即使 printf 打印了所有字符串。有什么建议吗?

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

#define PAGE_SIZE (8192)


int main(int argc, char** argv){

pid_t pid;
int fd;
char* buffer;

if (argc!= 2) {
printf("Syntax: prog file_name\n");
return -1;
}


fd=open(argv[1], O_RDWR);

if (fd== -1) {
printf("open error");
return -2;
}


buffer = (char*)mmap(NULL,PAGE_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
if (buffer == NULL){
printf("mmap error\n");
return -3;

}

pid = fork();

if(pid == -1){
printf("fork error\n");
return -4;

}

if(pid == 0){
gets(buffer);
return 0;
}

waitpid(pid, NULL);

printf("%s\n",buffer);

return 0;


}

最佳答案

mmap 在内存区域和文件(称为“支持文件”)的当前范围 之间建立关联。它不会改变文件的大小,也不一定会考虑文件大小的任何变化。

也许您的老师正试图通过这个例子向您展示这一事实。

如果文件比映射的内存范围短,则在执行 mmap 时,范围的其余部分将被零填充。但是,对该区域的修改不会写出到支持文件,并且可能对共享映射的其他进程可见,也可能不可见,即使 MAP_SHARED 已设置。

如果您创建了一个启用写入的映射区域,您应该避免引用文件中不存在的区域部分。 (如果您只想将该文件作为共享内存的永久备份,您可能应该使用 ftruncate 将文件的大小设置为所需的映射大小。)您必须在调用 mmap 之前执行此操作,因为如果在映射生效时更改文件大小,结果是未定义的行为。

关于c - gets 和 mmap 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com