簡體   English   中英

在C中分解由fork()創建的子進程

[英]Diposing a child process created with fork() in C

我的C作業程序將兩個矩陣相乘。 產品矩陣的每個條目都由使用fork()創建的子進程來計算。 子進程對此進行計算,然后使用管道將數據發送給父進程。 因此,如果產品矩陣的大小為10x10,我將創建100個子流程。 工作正常。

然后我注意到對於很大的矩陣,這是行不通的。 經過檢查后,我意識到這是因為在一定數目后( pid返回負),它將不再創建任何子進程。 例如,某種限制,這是有道理的。

確實,我不能指望我的計算機允許一個程序產生數千個子進程,因此很明顯,我的程序無法將超大型矩陣相乘。 好的。

然后發生在我身上:好吧,我不需要立即執行所有子進程。 我可以制造100個,讓他們做自己的事情,然后創建下一個100個,依此類推,直到對矩陣產品進行所有必要的計算。

我的程序本質上是一個循環,迭代rows * columns時間。 每次迭代,它都會生成一個子進程。 因此,我決定每進行100次迭代,我就會放置一個sleep()東西。 我的希望是,當完成sleep()操作后,之前的100個子進程將消失,從而“釋放”了下100個批處理所需的所有空間。 las,這沒有什么區別:程序的行為完全相同(當然,除了速度較慢之外)。

因此,鑒於sleep()事情不起作用,我懷疑我沒有適當地“殺死”孩子的過程。 這是子進程死亡的方式:

// Close the pipe!
close(fd[0]);
close(fd[1]);
// Exit
exit(0);

父級在讀取數據后也關閉管道:

read(fd[0], buffer, sizeof(buffer));
close(fd[0]);
close(fd[1]);

所以我的問題是:由於我已經創建了太多子進程而無法創建新的子進程,因此我似乎沒有適當地處置舊進程。 如何正確處置它們?

sleep(3)所做的是使進程暫時進入睡眠狀態,但仍然可以使其保持活動狀態。

如您所述,在創建更多子進程之前,需要確保子進程已死。 為此,子級需要在完成工作時正確exit(2) ,父進程應在其上使用wait(2)以便獲得它們,並在進程表中騰出空間。

一種可能的解決方案是先fork(2)一些子進程來完成部分工作,然后wait(2)他們完成,然后再fork更多的子進程來完成另一部分工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM