2014-11-23 4 views
0

큰 파일을 나눕니다. 파일의 각 부분을 읽으려면 fork()을 읽으려고합니다. 내 프로그램은 이미 파일을 읽고 이중 연결된 목록을 사용하여 파일에서 단어 발생의 총 개수를 계산합니다. 이제 파일을 다른 섹션으로 나누고 각각에 fork()을 사용해야합니다. mmap()을 이미 사용했지만이 파일로 수행 할 작업이나이 파일에 fork()을 구현하는 방법에 대해서는 확신 할 수 없습니다. 나는 fork() 예제를 보았지만 그 중 아무 것도 자식 프로세스를 만들고 pid 번호를 인쇄하는 것 외에는 아무 것도하지 않는 것 같습니다. 누구든지 내가하려고하는 일에 도움이되는 좋은 예를 알고 있습니까? 또는 어떻게이 부분을 구현할 수 있습니까? 읽기 좋은 생각파일에서 c에 fork()를 사용하는 방법

   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

[고급 리눅스 프로그래밍] (http://advancedlinuxprogramming.com/)에는'fork'에 대한 자세한 설명이 있습니다; 하지만 귀하의 경우에 사용 가치가 있는지 모르겠습니다 (문제는 I/O 바인딩, CPU 바인딩이 아님) –

+0

내 과제. fork를 사용하여 큰 파일에서 모든 단어의 출현을 세는 다른 프로세스를 만들어야합니다. –

+0

그런 다음 시도한 것은 무엇입니까? 'fork'를 호출하고, 결과를 유지하고, 실패시'<0', 자식 프로세스에서'== 0', 부모 프로세스에서'> 0' ... –

답변

0

(난 정말 코드를 얻을하지 않습니다 포크입니까?) 나는 생각하지 않는다

됩니다 : 여기

내 업데이트 된 코드의 일부이다 두 형제 과정에서 하나의 파일. 포크 (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)). 

이이 과정을 포크하기 전에 파일을 열 경우, 프로세스가 파일 기술자를 공유하는 것을 의미합니다.

파일 설명자가 공유되어 있고 여러 프로세스를 사용하여 파일을 읽으려는 경우 프로세스가 파일을 읽으려고 할 때마다 커서를 찾아야합니다. 그리고 그 호출은 뮤텍스 (mutex)에 의해 보호되어야하므로, 아마도 좋은 해결책은 아닙니다.

+0

내가 포크를 어떻게 구현해야하는지 잘 모르겠다. 코드에없는 이유가 그 것이다. 그래서 내가 파일을 열기 전에 fork()를 호출해야한다는 말입니까? 그러면 파일을 어떻게 나누겠습니까? –

+0

하나의 파일을 읽는 데 2 ​​개의 프로세스를 사용하는 것은 좋은 생각이 아닙니다. 게다가 나는 이것이 독서를 가속화 할 것이라고 생각하지 않는다. 그것은 독서 그 자체가 느리다. 정말 2 개의 프로세스를 사용해야합니까? – Matteo425

+0

1, 2, 4, 8, 16 프로세스로 테스트하고 성능을 비교해야합니다. –