我正在尝试读取一个大文件并将此文件映射到内存,然后通过将不同的起始和停止地址传递给不同的进程来划分工作负载,然后计算文件中所有单词的所有出现次数。我检查以下代码是否是文件,打开要读取的文件,并获取文件的大小。我不确定如何使用这个mmap()函数。具体来说,mmap()作为参数。偏移应该是什么以及从何处获取此值?
此外,如何使用fork()创建子进程?
stat(argv[1], &fileStat);
// Check if the INPUT is a file.
if (S_ISREG(fileStat.st_mode)) {
type = "file";
file = fopen(argv[1], "r");
if (!file)
perror("ERROR: Failed to open the file!");
// Check the total size of the file
stat(file, &fileStat);
size = fileStat.st_size;
// map file to memory and divide workload by passing different
// starting address and stopping address to different processes
addr = mmap(0, size, PROT_READ , MAP_SHARED , file, off_set);
// Count word occurrences
//count_words(file, words);
fclose(file);
} else {
perror("ERROR: Not a file!");
exit(1);
}
答案 0 :(得分:1)
偏移量是您希望mmap
开始的文件中的位置。如果要查看整个文件,请使用0的偏移量。
关于fork
的问题不清楚,mmap
和fork
并不真正有任何关系。
答案 1 :(得分:0)
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
通话格式:pa=mmap(addr, len, prot, flags, fildes, off);
mmap()函数应在地址之间建立映射 地址pa处的进程空间,用于到存储器的len个字节 由文件描述符表示的对象在len的偏移off处 字节。 pa的值是实现定义的函数 参数addr和标志值,进一步描述如下。一个 成功的mmap()调用应返回pa作为其结果。地址 从pa开始并继续len字节的范围应该是合法的 对于可能的(不一定是当前的)地址空间 处理。从off开始并继续为len的字节范围 字节应该是合法的(不一定是当前的) 文件,共享内存对象或类型化内存对象中的偏移量 由fildes代表。
试试这个link
叉子上的试试这个link