2016-05-12 132 views
4

這個問題特別針對perl,在上下文中,我特別想知道當文件句柄(在操作時和不在操作時)在打開句柄的腳本die時發生了什麼。perl腳本結束會發生什麼?

那麼當執行到達腳本的最後一行時會發生什麼操作?腳本級別? Perl級別?殼級(例如bash)?系統級別(例如假設一個現代的* nix,比如Ubuntu)?

這裏是什麼信息,我已經發現迄今,雖然沒有直接的答案:在dieexit

Best practices for terminating perl scripts

Ensure custom code is run upon exit in perl

Why to close file handles in perl (sys buffers)

的Perldoc講的大多是函數本身。

+1

手柄關閉。 – Mort

+0

@Mort:perlmonks鏈接表示同樣多。 – tniles09

回答

1

Perl使用引用計數策略進行垃圾回收。當變量的引用計數達到0時,在將其內存釋放到perl的內存管理系統之前調用任何適用的DESTROY方法。

當程序終止時,其餘的變量將超出範圍並且引用計數遞減。這是您的文件處理將關閉的點。

當perl完成清理操作後,它將退回到操作系統,此時其剩餘資源將返回到操作系統,並且會通知其父進程(可能是init或shell)的退出狀態。


引用計數可能會出差錯:如果創建循環引用的數據結構,沒有一個組件變量的自然也會有自己的引用計數下降到0,除非你要麼削弱引用的一個或顯式調用它DESTROY方法。在這種情況下,變量將一直存在,直到程序結束,此時perl將會拒絕DESTROY和/或垃圾收集所有內容,而與引用計數無關。

+0

你能推薦任何資源來進一步探索/閱讀這些主題嗎?我發現[this](http://perldoc.perl.org/index-internals.html),但它涵蓋了很多理由。 – tniles09

+0

@ tniles09如果你使用的變量不比嵌套數組和散列複雜,那麼你可以簡單地假定當最後一個引用超出範圍時它們將被收割。如果你使用的是循環數據結構,那麼[perlref的這一部分](http://perldoc.perl.org/perlref.html#Circular-References)就足夠了。如果您通過XS或「Inline :: C」設計C API的接口,那麼您可能對*鏈接到的所有內部文檔感興趣。 – tjd

+0

調用'DESTROY'不會導致引用計數下降到零。甚至可能沒有'DESTROY'方法來調用。 –

-1

如果您的指針/文件處理程序沒有被適當地解散,垃圾收集將執行昂貴的標記/掃描操作。

在perl級別上運行垃圾收集。在shell上,正常的中斷者和錯誤處理程序仍然會接收IO。在系統級別上,垃圾回收會告訴系統調用重新分配內存。