2017-03-04 4 views
1

n 개의 하위 프로세스가있는 filesize 크기의 파일을 읽으려고합니다. 내 질문은 : filesize % subprocesses 경우 = 0, 파일의 전체가 읽을 수 있도록 filesize 어떻게 배포합니까? 내 생각은 하위 프로세스 중 하나를 다른 프로세스보다 약간 적게 읽는 것이었지만 어떻게해야하는지 잘 모르겠습니다. 다음은 내 코드입니다. 하위 프로세스는 내가 fork()하는 자식의 수입니다.C : 동일한 파일에서 여러 개의 하위 프로세스를 읽는 중

fstat(infile, &filestatus); 
filesize = filestatus.st_size; 
fs = (filesize + (subprocesses /2))/subprocesses; 

이 유형의 반올림 문제는 하위 프로세스를 변경할 때 올바르게 infile을 읽지 않습니다. 어떤 도움이라도 대단히 감사합니다!

답변

1

subprocesses > 1filesize > 0 가정, 둘 다 정수형, 당신이해야 할 모든 fs_last = filesize - (subprocesses - 1)*fs이 같은 일을 할 것, 수학적으로

if (filesize % subprocesses == 0) 
{ 
     fs = filesize/subprocesses; 
} 
else 
{ 
    fs = filesize/(subprocesses-1);  // amount to be read by all except the last subprocess 

    fs_last = filesize % (subprocesses - 1) // amount to be read by the last subprocess 
} 

입니다 - 그 정수 연산의 속성입니다.

다음 문제는 각 하위 프로세스와 얼마나 많은 정보를주고받을 것인가입니다. 또는 마지막 서브 프로세스가 마지막 서브 프로세스임을 확인하여 (fs_last 대신 fs 문자를 읽으려고 시도하지 않음).

+0

피터 저는 당신에게 빚이 있습니다! 그래, 이제 마지막 서브 프로세스가 마지막 서브 프로세스임을 어떻게 알 수 있을까? 나는 for 루프를 사용하여 n 개의 하위 프로세스를 포킹합니다. 어떻게 그렇게 할 수 있습니까? – ashadeka

+0

'fork()'를 호출 할 때마다 반환 값을 확인해야합니다. fork 된 프로세스는 반환 값 0을 받고, 부모는 fork가 성공하면 양수 값을 받고, fork가 실패하면 음수 값을받습니다. 마지막 서브 프로세스는'fork()'가 루프의 마지막 반복에서 0을 리턴하는 것을 특징으로한다. – Peter

+0

코드가 하위 프로세스 (모든 하위 프로세스가 하위 프로세스)를 실행하기 위해'exec *'를 호출하면 바이트 수 읽기 및 첫 번째 바이트로 읽는 오프셋이 두 매개 변수는 하위 프로세스로 전달됩니다. 두 번째 옵션으로 각 프로세스는 동일한 숫자 바이트를 읽으려고 시도합니다. 마지막 하위 프로세스는 EOF를 기록합니다.이 프로세스는 더 이상 바이트를 읽지 못하도록 코드 프로세스를 중지해야합니다. – user3629249