我一直在用C/C++編寫程序,這些程序使用Linux API並進行諸如fork(),read(),write()等系統調用。現在,我開始懷疑這些庫函數是否實際上是系統調用,或者它們是某種包裝函數。函數調用像read(),write()在linux中的實際系統調用?
當程序調用write()時真的發生了什麼? 這個函數如何與內核交互? 如果這是一個包裝,那麼我們爲什麼需要它?
我一直在用C/C++編寫程序,這些程序使用Linux API並進行諸如fork(),read(),write()等系統調用。現在,我開始懷疑這些庫函數是否實際上是系統調用,或者它們是某種包裝函數。函數調用像read(),write()在linux中的實際系統調用?
當程序調用write()時真的發生了什麼? 這個函數如何與內核交互? 如果這是一個包裝,那麼我們爲什麼需要它?
所有這些功能都是您的二進制鏈接到的libc.so
中的真實用戶空間功能。但其中大部分只是系統調用的小包裝,它們是用戶空間和內核之間的接口(另請參閱syscall(2)
)。
注意,是純粹的用戶空間函數(如fmod(3)
)或做除了用戶空間的一些事情,調用內核(如execl(3)
)有自己的聯機幫助頁在第3節,而功能只是調用內核(如read(2)
)有他們使用這個簡單的代碼段2
:
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()
系統調用的包裝
約assenbly閱讀你的編譯器發出的代碼或使用調試器來跟蹤什麼如何你的程序呢? – MikeCAT
查找簡單系統調用包裝器的簡單方法是使用'man'。第2節包含系統調用,這樣'man 2 read'顯示出來表明讀取確實是一個包裝系統調用。 –