類似於fork()和vfork(),linux特有的系統呼叫clone()也能建立乙個新執行緒。與前兩者不同的是,後者在程序建立期間對步驟的控制更為準確。其主要用於執行緒庫的實現。其函式原型如下:
#define _gnu_source
#include int clone(int (*func)(void*),void *child_stack,int flags,void *func_arg,....
/*pid_t *ptid,struct user_desc *tls,pid_t *ctid*/);
return process id of child on success,or -1 on error
如同fork(),由clone()建立的新程序幾近於父程序的翻版。
但是與fork()不同的是,轉殖生成的子程序繼續執行時不以呼叫處為起點,轉而去呼叫以引數func所指定的函式,func又稱為子函式。呼叫子函式時的引數由func_arg指定。經過轉換,子函式可對改引數的含義自由解讀,例如可以作為整型值(int),也可以視為指向結構的指標。
當函式func返回或者是呼叫exit()(或者_exit())之後,轉殖產生的子程序就會終止。照例,父程序可以通過wait()一類函式來等待轉殖子程序。
因為轉殖產生的子程序可能共享父程序記憶體,所以它不能使用父程序的棧。相反,呼叫者必須分配一塊大小適中的記憶體空間供子程序的棧使用,同時將這塊記憶體的指標置於引數child_stack中。
引數flags服務於雙重目的。首先,其低位元組中存放著子程序的終止訊號,子程序退出時其父程序將收到這一訊號。(如果轉殖產生的子程序因訊號而終止,父程序依然會收到sigchld訊號)該位元組也可能為0,這時將不會產生任何訊號。
clone()函式中的flags引數是各位掩碼的組合。其引數如下:
如果指定了該標誌,父子程序會共享同乙個開啟檔案描述符表。也就是說,無論哪個程序對檔案描述符的分配與釋放都會影響寧乙個程序。
如果指定了該標誌,那麼父子程序將共享與檔案系統相關的資訊:許可權掩碼、根目錄以及當前工作目錄。也就是說無論在哪個程序中呼叫umask()、chdir()或者chroot(),都將影響到另乙個程序。
如果設定了該標誌,那麼父子程序將共享同一訊號處置表。無論在哪個程序中呼叫sigaction()或者signal()來改變對訊號處置的設定,都會影響其他程序對訊號的處置。
如果設定了該標誌,父子程序將會共享同乙份虛擬記憶體頁。無論哪乙個程序更新了記憶體,或是呼叫了mmap()、munmap(),另一程序同樣會觀察到變化。
若設定了該標誌,則會將子程序置於父程序的執行緒組中。如果未設定該標誌,那麼會將子程序置於新的執行緒組中。
為實現posix執行緒,linux2.6提供了對clone_parent_settid、clone_child_settid和clone_child_cleartid的支援。這些標誌將會影響clone()對引數ptid、ctid的處理。如果設定了clone_parent_settid,核心會將子程序的執行緒id寫入ptid所指向的位置。如果設定了clone_child_settid,那麼clone()會將子執行緒的執行緒id寫入指標ctid所指向的位置。如果設定了clone_child_cleartid,則會在子程序終止時將ctid所指向的記憶體清零。
如果設定了該標誌,那麼引數tls所指向的user_desc結構會對執行緒所使用的執行緒本地儲存緩衝區加以描述。
如果設定了該標誌,父子程序會將共享同乙個systemv訊號量撤銷值列表。
預設情況下,當呼叫clone()建立新程序時,新程序的父程序就用clone()程序。如果設定該標誌,那麼呼叫者的父程序就成為子程序的父程序。
如果設定了clone_ptrace且正在跟蹤子程序,那麼也會對子程序進行跟蹤。從linux2.6起,即可設定clone_untraced標誌,這也意味著跟蹤程序不能強制其子程序設定為clone_ptrace
如果設定了該標識,父程序將一直掛起,直至子程序呼叫exec()或者_exit()來釋放虛擬記憶體資源為止。
系統呼叫 函式呼叫
linux下對檔案操作有兩種方式 提供了庫函式,如open close read write ioctl 等,需包含標頭檔案unistd.h。以write 函式為例 其函式原型為size t write int fd,const void buf,size t nbytes 其操作物件為檔案控制代碼...
系統呼叫函式
1.位元組順序和轉換函式 先來了解乙個概念 大端模式和小端模式 大端模式是指高位元組資料存放在低位址處,低位元組資料存放在高位址處.小端模式是指低位元組資料放在記憶體的記憶體低位址處,高位元組資料存放在記憶體的高位址處 在網路上傳輸資料時,由於資料傳輸的兩端可能對應不同的硬體平台,採用的儲存位元組的...
系統呼叫與庫函式呼叫
linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...