2017-03-04 64 views
1

我試圖從大小爲sizeize的文件中讀取n個子進程。我的問題是這樣的:如果filesize%subprocesses!= 0,我如何分配文件大小以便讀取整個文件?我的想法是讓其中一個子流程讀取比其他流程略少,但我不知道如何去做。這是我的代碼,subprocesses是我fork()的子項數。C:從同一個文件中讀取多個子進程

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

這種類型舍入的問題是,當我改變子進程時,我沒有正確讀取infile。任何幫助是極大的讚賞!

回答

1

假設subprocesses > 1filesize > 0,都是整體式的,所有你需要做的是

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 = filesize - (subprocesses - 1)*fs會做同樣的事情 - 這是整數運算的性能。

您的下一個問題將會傳達​​給每個子流程多少讀。或者確保最後一個子進程知道它是最後一個(所以它不會嘗試讀取fs字符而不是fs_last)。

+0

彼得我欠你一個!是的,現在我被困在如何讓最後一個子進程知道它的最後一個子進程?我使用for循環來分叉n個子進程,那麼我該怎麼做呢? – ashadeka

+0

對於每個'fork()'調用,你應該檢查返回值。分叉進程接收到返回值爲零,如果分叉成功,父接收到一個正值,如果分叉失敗,則接收到負值。最後一個子進程的特徵是'fork()'在循環的最後一次迭代中返回零。 – Peter

+0

當代碼調用'exec *'執行一個子進程(所有的子進程都是子進程)時,包含了要讀取的字節數和要讀取的第一個字節的偏移量,參數傳遞給子進程。作爲第二種選擇,每個進程嘗試讀取相同的數字字節,最後一個子進程將會碰到EOF,應該對EOF進行編碼,以阻止該進程嘗試讀取更多字節。 – user3629249

相關問題