Linux 程序建立

2021-07-11 08:57:33 字數 2134 閱讀 4010

1、linux建立程序的方式是先通過呼叫fork建立乙個和呼叫程序基本一樣的子程序,二者之間的區別在於pid和ppid不同。然後子程序呼叫exec函式裝載乙個新的程序到位址空間執行。

其他的作業系統產生子程序的方式是spawn:在新的位址空間中建立程序,然後載入可執行檔案執行。

2、傳統的fork是將所有的資源都複製給新的程序,但linux使用了cow(copy-on-write)技術,只有在需要寫入的時候才複製整個位址空間。這樣做的好處就是當子程序產生之後如果立刻呼叫exec就不必複製了。

3、fork,vfork,__clone都是通過傳給clone不同的引數來實現的。clone呼叫do_fork來實現程序的建立。

do_fork函式

①呼叫copy_process來完成程序的複製

p =copy_process(clone_flags, stack_start, regs, stack_size,child_tidptr, null, trace);
②呼叫wake_up_new_task讓子程序先執行

wake_up_new_task(p, clone_flags);
③返回新建立程序的pid

copy_process函式

①根據clone_flags執行一些檢查

if ((clone_flags & (clone_newns|clone_fs)) == (clone_newns|clone_fs))

return err_ptr(-einval);

if ((clone_flags & clone_thread) &&

!(clone_flags & clone_sighand))

return err_ptr(-einval);

if ((clone_flags & clone_sighand) &&

!(clone_flags & clone_vm))

return err_ptr(-einval);

if ((clone_flags & clone_parent) &&

current->signal->flags & signal_unkillable)

return err_ptr(-einval);

retval = security_task_create(clone_flags);

if (retval)

goto fork_out;

retval =

-enomem;

②呼叫dup_task_struck函式複製程序描述符和thread_info,此時父子程序完全一樣

p = dup_task_struct(current);

if (!p)

goto fork_out;

③執行檢查判斷是否超出給他分配的資源的限制

if (atomic_read(&p

->

real_cred

->

user

->

processes) >=

p->

signal

->

rlim[rlimit_nproc].rlim_cur)

④初始化子程序描述符中的各個值,包括:

⑤返回程序描述符

dup_task_struck函式

①呼叫alloc_task_struct分配一塊程序描述符的空間

tsk = alloc_task_struct();

if (!tsk)

return

null;

②呼叫alloc_thread_info分配乙個thread_info

ti = alloc_thread_info(tsk);

if (!ti)

③將父程序的程序描述符和thread_info賦值給新建立的程序描述符與thread_info

*ti = *orig->thread_info;

*tsk = *orig;

tsk->thread_info = ti;

ti->task = tsk;

Linux 程序建立

華清遠見嵌入式學院 上海分中心講師。在 linux 核心內,程序是由相當大的乙個稱為 task struct 的結構表示的。此結構包含所有表示此程序所必需的資料,此外,還包含了大量的其他資料用來統計 accounting 和維護與其他程序的關係 父和子 下面給出了 task struct 的一小部分...

Linux程序 程序的建立

今天學習了linux的程序建立的基本原理,是基於0.11版本核心的。下面對其作一下簡單的總結。一 linux程序在記憶體中的相關資源 很容易理解,linux程序的建立過程就是記憶體中程序相關資源產生的過程,那麼linux程序在記憶體中有哪些相關資源呢?1 task陣列中的一項 乙個指標指向程序的ta...

Linux 程序建立 程序終止

程序終止 fork 在linux中fork函式時非常重要的函式,它從已存在程序中建立乙個新程序。新程序為子程序,而原程序為父程序。include pid t fork void 返回值 自程序中返回0,父程序返回子程序id,出錯返回 1子程序複製父程序的pcb,因此複製了父程序的程式計數器,所以和父...