2016-02-28 61 views
8

我一直在用C/C++編寫程序,這些程序使用Linux API並進行諸如fork(),read(),write()等系統調用。現在,我開始懷疑這些庫函數是否實際上是系統調用,或者它們是某種包裝函數。函數調用像read(),write()在linux中的實際系統調用?

當程序調用write()時真的發生了什麼? 這個函數如何與內核交互? 如果這是一個包裝,那麼我們爲什麼需要它?

+1

約assenbly閱讀你的編譯器發出的代碼或使用調試器來跟蹤什麼如何你的程序呢? – MikeCAT

+2

查找簡單系統調用包裝器的簡單方法是使用'man'。第2節包含系統調用,這樣'man 2 read'顯示出來表明讀取確實是一個包裝系統調用。 –

回答

6

所有這些功能都是您的二進制鏈接到的libc.so中的真實用戶空間功能。但其中大部分只是系統調用的小包裝,它們是用戶空間和內核之間的接口(另請參閱syscall(2))。

注意,是純粹的用戶空間函數(如fmod(3))或做除了用戶空間的一些事情,調用內核(如execl(3))有自己的聯機幫助頁在第3節,而功能只是調用內核(如read(2))有他們使用這個簡單的代碼段2

+0

這是相反的方式。純粹的包裝函數在第2節中。第3節是其餘部分。見例如execl(3)和execve(2)。 – a3f

+0

@ a3f這就是他所說的。第2節中的系統調用包裝,第3節中的純用戶空間函數。 – EJP

+2

@EJP有人可能會認爲第3節中的條目不會調用內核。否則,他們將不得不在第2節中,因爲答案當前陳述了「在第2節中調用內核的函數」。 – a3f

1

int main() 
{ 
    int f = open("/tmp/test.txt", O_CREAT | O_RDWR, 0666); 
    write(f, "hello world", 11); 
    close(f); 

    return 0; 
} 

可以使用strace找到二進制文件中使用系統調用:

gcc test.c -o test 
strace ./test 

的結果是這樣的:

. 
. 
. 
open("/tmp/test.txt", O_RDWR|O_CREAT, 0666) = 3 
write(3, "hello world", 11)    = 11 
close(3)        = 0 
exit_group(0)       = ? 

fork(),它實際上是圍繞clone()系統調用的包裝