如何在文件中使用c中的fork()

时间:2014-11-23 19:04:09

标签: c fork mmap

我正在尝试将大文件和fork()分开来读取文件的每个部分。我的程序已经读入文件并使用双向链表计算文件中出现的单词总数。现在我需要将文件分成不同的部分,并在每个部分使用fork()。我已经使用过mmap(),但我不确定如何处理它,或者如何在此文件上实现fork()。我看过fork()个例子,但除了创建子进程并打印pid数字之外,它们似乎都没有做任何事情。有谁知道任何有助于我尝试做的好例子?或者我如何实现这部分?

以下是我更新代码的一部分:

             proc_num = atoi(argv[3]); // assign the PROCNUMBER to proc_num as an integer
             section = size/proc_num;
             // map file to memory and divide workload by passing different
             // starting address and stopping address to different processes
             if ((addr = mmap(0, size, PROT_READ, MAP_SHARED , file, 0)) == (void *) -1) {
                perror("ERROR: Mapping did not work!");
                exit(1);
             }
             char tmp_word[25];
             int  j, k = 0;
             addr = mmap(0, size, PROT_READ, MAP_SHARED , file, 0);
             char buf[proc_num][1024];
             // Create fork
             pid = fork();
             if (pid == -1) {
                perror("ERROR: Fork failed!");
             } else {
                for (i = 0; i < proc_num; i++) {
                   for(j = 0; j < size; j++) {
                      if(addr[i*size+j] != ' ' && addr[i*size+j] != '\n') {
                         tmp_word[k]=addr[i*size+j];
                         k++;
                      } else {
                         tmp_word[k]='\0';
                         // Count the words
                         count_words(tmp_word, words);
                         tmp_word[0] = '\0';
                         k = 0;
                      }
                   }
                }
             }
             kill(pid, SIGKILL);
             munmap(addr, size);
             close(file);
             } else {
                perror("ERROR: Not a file!");
                exit(1);
             }

1 个答案:

答案 0 :(得分:0)

(我真的没有你的代码,叉子在哪里?)

我认为从2个兄弟进程中读取一个文件是个好主意。

从fork(2):

 The child inherits copies of the parent’s set of open file  descrip-
 tors.   Each  file  descriptor  in the child refers to the same open
 file description (see open(2)) as the corresponding file  descriptor
 in  the parent.  This means that the two descriptors share open file
 status flags, current file offset, and signal-driven I/O  attributes
 (see the description of F_SETOWN and F_SETSIG in fcntl(2)).

这意味着如果在分叉进程之前打开文件,进程将共享文件描述符。

如果文件描述符是共享的,并且您希望使用多个进程来读取文件,则每次进程尝试读取文件时都需要搜索光标。并且该调用应该由互斥锁保护,因此可能不是一个好的解决方案。