<背景>
內核線程類似於用戶進程,通常用於並並發處理性質的任務,並且可以搶占調度。不同於用戶進程,內核線程位於內核空間,並且可以訪問內核函數和內核數據。
<創建內核線程>
a:ret = kernel_thread(mythread,null,CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD)
參數注釋:
CLONE_FILES:大開的文件共享
CLONE_SIGHAND:信號處理程序共享
注:由於內核線程通常對設備驅動程序起到輔助作用,往往在設備初始化的時候被創建。在線程開始的時候會調用函數daemonize(),該函數會執行初始化的任務,之后將父進程改為kthreadd(每一個Linux進程都會有一個父進程,在子進程沒有全部退出的情況下殺死父進程,會導致子進程成為僵屍進程,繼續消耗計算機資源),將父進程改為ktheadd可以避免這種情況。
daemonize()在默認情況下會阻止所有信號,所以如果想象處理信號,就應該調用函數allow_signal()來使能它。如果內核中沒有信號可以調用函數signal_pending()來檢測信號的存在並采取相應的行動。