2012-06-29 44 views
1

當我man -a close,第一頁是POSIX手冊頁,然後我有一個close(2),(2表示系統api或內核func)。這意味着至少有兩個版本的close()在我的linux中,從posix庫或內核中調用close()的哪個版本?

例如,這段代碼是這樣的:

int fd = open("xxx"); 
........ 
close(fd); -----here, which version is called, 
        is that one from the POSIX lib, or the raw system API? 

PS:因此,我的linux系統,包括大多數系統API調用POSIX包裝,如何辨別我的代碼是否被調用POSIX lib或原來的系統API ?

回答

3

「這意味着至少有兩個版本的close()。」

不,這意味着有兩個版本的文件需要關閉。

+0

據我所知,有幾種情況我們需要通過某種方式顯式聲明我們是使用POSIX還是SYSTEMV風格(使用信號量或線程等等),在這種情況下,它是否意味着linux保留一些函數的兩個實現?一個COM從POSIX,但其他人適合一些舊式? – basketballnewbie

5

POSIX不是一個庫,它是一個標準。手冊頁的POSIX版本告訴你POSIX標準說明函數應該做什麼(以及基於哪個版本的POSIX)。如果您只依賴本頁中描述的行爲,那麼您的代碼應該在所有實現POSIX標準的系統上工作(只要它們實現了足夠的版本)。

Linux版本的聯機幫助頁告訴你函數實際上在你的系統上做了什麼。在絕大多數情況下,這裏描述的行爲將是POSIX頁面中描述的行爲的超集,即Linux行爲將遵循POSIX標準,但它也可能定義POSIX未定義的情況或者函數可能接受其他選項不是由POSIX授權的。

如果您依賴於POSIX未指定的任何行爲,那麼您的代碼可能僅適用於Linux系統。

+0

tks,s​​epp2k.you很清楚.POSIX不是一個庫,它是一個標準的-----------如果有一些行爲本來不符合Linux的POSIX,linux是否做了一些總結lib來滿足它?如果有的話,任何例子? – basketballnewbie

+0

POSIX要求'close'是一個取消點,而Linux內核對線程取消一無所知,所以'close'的用戶空間libc包裝必須對其進行修補。 –

+0

userspace libc wrapper for close _____ libc wrapper爲我們的應用程序封裝了任何系統api,例如,如果我們調用close/open或其他系統api,wo實際先調用libc,然後libc調用kernel for usr?如果是這種情況,爲什麼應該存在libc? – basketballnewbie

相關問題