2014-11-21 48 views
-3

我正在尝试读取大文件并将此文件映射到内存,然后通过将不同的启动和停止地址传递给不同的进程来分配工作负载,然后计算所有进程文件中所有单词的出现。下面的代码检查它是否是一个文件,打开要读取的文件并获取文件的大小。我不确定如何使用这个mmap()函数。具体来说,mmap()作为参数。偏移量应该是多少?我从哪里得到这个值?如何在c中使用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

阅读手册页,这是很清楚的:http://man7.org/linux/man-pages/man2/ mmap.2.html – Deduplicator 2014-11-21 19:30:05

回答

1

偏移量是您要在mmap开始的文件中的哪个位置。如果您想查看所有文件,请使用偏移量0.

您对fork的看法尚不明确,mmapfork彼此没有任何关系。

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()函数应在len个字节的地址PA建立进程的地址 空间之间的映射由表示的存储器 对象文件描述符fildes在偏移off len 字节。 pa的值是 参数addr和flags的值的实现定义的函数,在下面进一步描述。 A 成功的mmap()调用将返回pa作为其结果。对于 进程的可能的(不一定是当前的)地址空间,地址 范围从pa开始并且继续len字节应该是合法的 。从off开始并继续字节的字节范围对于由fildes表示的文件,共享内存对象或类型化内存对象 中的可能(不一定是当前) 偏移量应是合法的。

试试这个link

上叉侧试试这个link