2017-10-26 15 views
-1

목표는 "ls"기능을 구현하여 지정된 디렉터리를 검사하고 처리 할 .csv 파일을 찾을 수있게하는 것입니다. 내 생각은 지금 csv 파일이 ls 함수를 사용하여 탐지 될 때마다 fork()를 사용하여 자식 프로세스를 만드는 것이지만이 작업을 수행하는 방법에 대해서는 매우 혼란스러워합니다. geeksforgeeks에서 fork() 페이지를 읽었으며 csv 파일이 발견 될 때마다 fork를 호출하면 하위 프로세스가 2를 계속 곱합니다. 그리고 fork 명령문에 전체 처리 코드를 래핑해야합니까? 다른 자식을 만들기 전에 각 자식 프로세스가 완료되기를 기다렸다면 다중 처리가되지 않습니다. 나는 여전히 C 언어를 배우고 있으며 fork 함수가 실제로 어떻게 작동 하는지를 이해하기가 어렵다. 어떤 도움이라도 대단히 감사하겠습니다. 감사합니다.디렉터리 검색 및 C에서 분기와 동시에 특정 파일 처리

+2

'fork' 호출로 생성 된 자식 프로세스는 디렉토리 검색을 계속해서는 안되며 파일을 처리 한 다음'exit'해야합니다. 아마 당신이 조금만 검색한다면 스택 오버플로를 포함하여 인터넷 전체에서'fork '를 사용하는 방법의 수백만 가지 예가있을 것입니다. –

+0

파일 당 새 프로세스를 포크하려는 이유가 무엇입니까? 그것은 당신이 무엇이든간에 비용이 많이 드는 방법입니다. 'fork()'를 사용하여 운동을하는 것이 목적이라면, 그것은 한 가지입니다; 진지한 일을하려한다면, 그것은 또 다른 일입니다. 자식이 exec'ls'를 처리하면 프로세스가 폭발하지 않을 것입니다 - 매번 2 씩 증가하지 않습니다. –

+0

fork를 호출 한 후 반환 값을 확인합니다. '0'을 반환하면 자식이됩니다. 파일을 처리하고 루프를 계속하지 않고 종료하는 함수를 호출합니다. 0이 아닌 값을 반환하면 여전히 부모 프로세스에 있으므로 스캔을 계속합니다. – Barmar

답변

0

기본 구조는 다음과 비슷한 모습이 될 것입니다 pid의 반환 값은 당신이 상위 또는 하위에 계속하고 있는지 구별하는 데 사용됩니다

while(d = readdir(fd) { 
    if (iscsv(d->d_name)) { 
     int pid = fork(); 
     switch(pid) { 
     case 0: // Child process 
      process_csv(d->d_name); 
      exit(0); 
      break; 
     case -1: // Error 
      perror("fork"); 
      exit(1); 
      break; 
     default: // Parent 
      printf("Forked PID %d to process %s\n", pid, d->d_name); 
    } 
} 

. 자식 프로세스가 파일을 처리하고 종료하면 부모 프로세스가 계속 반복됩니다. 따라서 원본 부모 만 루핑 및 분기를 유지하기 때문에 중복 처리 (fork bomb)를 유지하지 마십시오.

+0

wait() 시스템 호출을 추가해야 자식 프로세스가 다른 자식을 분기하기 전에 실행되었는지 확인하거나 필요하지 않은지 확인하십시오. – codemonkey

+0

모든 처리를 동시에 수행하려면 필요하지 않습니다. 그게 자식 과정에서하는 이유야, 그렇지? – Barmar