从您的问题状态来看,您是否能够让mmap 工作尚不清楚。您添加的最后一个编辑:
int fp = open(argv[1],O_RDWR);
如果您正在回写已打开的文件,这很好,但如果不是,您应该使用O_RDONLY 打开以防止无意修改您的原始文件。
虽然不是错误,但fp 通常用作在使用fopen 打开文件时与文件流操作相关联的文件指针。在这里,您使用带有read/write 的低级I/O,它使用文件描述符 而不是流指针。当引用一个描述符时,通用语言使用fd 作为文件描述符的简写。 (就个人而言,看到这两者以互换的方式使用是很尴尬的——我怀疑其他人也是如此)
您对fstat 的剩余使用、产生的buf.st_size 以及您对mmap 的调用都不是问题。您的问题出在其他地方 - 这是您应该发布 A Minimal, Complete, and Verifiable Example (MCVE) 的主要原因之一。
也就是说,为了确保您以正确的方式合并您的更改,我将为您提供一个简单的示例,即 mmapsa 文件并将文件转储到 stdout(因此将您的输入文件名限制为与示例一起使用的相当短的文本文件——否则你会看到各种奇怪的字符)。完成以下工作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int diskinfo (int argc, char *argv[]) {
char *p = NULL; /* pointer to mmapped file */
int fd = 0; /* file descriptor */
struct stat buf = {0}; /* struct stat */
ssize_t size = 0; /* file size (typed for write return) */
if (argc < 2) { /* validate at least 2 arguments */
printf ("Please put %s <file> \n", argv[0]);
exit (EXIT_FAILURE);
}
if ((fd = open (argv[1], O_RDONLY)) == -1) { /* open/validate file */
perror ("Error opening file");
exit (EXIT_FAILURE);
}
if (fstat (fd, &buf) == -1) { /* stat file for size */
perror ("error: fstat buf");
exit (EXIT_FAILURE);
}
size = buf.st_size; /* get file size */
/* mmap file and validate return */
if ((p = mmap (NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0))
== (void *) -1) {
perror ("mmap failed");
exit (EXIT_FAILURE);
}
/* simple example, output mmapped file to stdout */
if (write (STDOUT_FILENO, p, size) != size) {
perror ("error on write");
exit (EXIT_FAILURE);
}
munmap (p, size); /* unmap file */
return 1; /* return success (fn could be void due to exit) */
}
int main (int argc, char **argv) {
diskinfo (argc, argv); /* call diskinfo function */
return 0;
}
(注意:你对if (argc < 2)的检查应该在调用函数中完成,这里是main()。在你确认你有一个文件名之前,没有理由调用diskinfo打开。你实际上可以重构你的代码来检查参数和openmain() 中的文件,并简单地将打开的文件描述符作为参数传递给diskinfo)
使用/输出示例
$ ./bin/mmapdiskinfo dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
检查一下,如果您有任何问题,请告诉我。如果您仍然无法让您的功能正常工作,请发布 MCVE,以便我们进一步提供帮助。