2011-09-20 101 views
8

看來兩者都做同樣的事情,是吧?Perl中的open和sysopen有什麼區別?

有人可以告訴我一個他們做不同工作的例子嗎?

+2

這不是一個內部的差異,這是一個外部的差異,就像Blagovest Buyukliev所說。 – ikegami

+0

@lexer,我補充了更多的解釋。希望能幫助到你。 –

回答

18

sysopen圍繞open(2)內核系統調用一個瘦包裝(參數直接對應),而open是一個更高層次的包裝,使您能夠做重定向,管道等

除非你正在使用一個特定的設備,需要一些特殊的標誌,通過open(2)時間,對於磁盤上的普通文件,你應該罰款open

+0

雖然 – lexer

+2

我還是沒有看到其中的區別 @lexer:真的沒什麼可說的 - 剩下的就是了解系統調用是什麼,以及open(2)的特定接口是什麼,所有這些都是OS的東西,而不是Perl特有的。 –

+2

@lexer:答案是現貨。如果您需要真實生活,請考慮「O_WRONLY | O_EXCL | O_CREAT」組合,即「如果不存在,則創建並寫入」。使用'-f ...或打開...'而不是隻是要求競賽條件。 – Dallaylaen

12

引述perlopentut

如果你想在外殼的簡便,Perl的開放是 肯定要走的路。另一方面,如果你想要比C的簡單化fopen(3S)提供的更精細的 精度,你應該看看Perl的sysopen,它是open(2)系統調用的直接鉤子。 這確實意味着它有更多的參與,但這是精度的價格。

由於Perl是用C寫的,這兩種方法有可能最終使open(2)系統調用。不同的是,open()在Perl內置了一些細微使開放管道重定向非常容易。但同時,open()帶走了一些靈活性。它不具有sysopen()中的Fcntl功能,也沒有掩蔽功能。

大多數情況下只需要open()

+0

您能否提供'sysntn'中'Fcntl'和屏蔽功能的示例? – lexer

+0

在這裏有一些很好的口罩示例:http://perldoc.perl.org/perlopentut.html#Permissions-agrave-la-mode,以及上面鏈接土地的相同鏈接中的部分有很好的示例'Fcntl'功能。該部分以「這是你可以用sysopen完成的事情開始,你不能用常規打開。」請享用! –

相關問題