Sowohl Eltern als auch Kind gibt verschiedene Werte aufgrund der Manipulation der CPU-Register im Kontext des Kindes zurück.
Jeder Prozess im Linux-Kernel wird durch task_struct repräsentiert. task_struct ist in der thread_info-Struktur eingeschlossen (Zeiger), die am Ende des Kernel-Modus-Stacks liegt. Whole CPU-Kontext (Register) sind in dieser thread_info-Struktur gespeichert.
struct thread_info {
struct task_struct *task; /* main task structure */
struct cpu_context_save cpu_context; /* cpu context */
}
Alle fork/clone() - Systemaufrufe ruft Kernel-gleichwertige Funktion do_fork().
long do_fork(unsigned long clone_flags,
unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
Hier ist die Reihenfolge der Ausführung
do_fork() -> copy_process-> copy_thread() (copy_thread ist arch spezifische Funktionsaufruf)
copy_thread() kopiert die Registerwerte von dem Elternteil und ändert den Rückgabewert zu 0 (im Fall des Arms)
struct pt_regs *childregs = task_pt_regs(p);
*childregs = *regs; /* Copy register value from parent process*/
childregs->ARM_r0 = 0; /*Change the return value*/
thread->cpu_context.sp = (unsigned long)childregs;/*Write back the value to thread info*/
thread->cpu_context.pc = (unsigned long)ret_from_fork;
Wenn das untergeordnete Element eingeplant wird, führt es eine Assembly-Routine ret_from_fork() aus, die Null zurückgibt. Für die Eltern wird es den Rückgabewert aus dem do_fork(), dem Prozess pid von
ist
nr = task_pid_vnr(p);
return nr;
Es ist häufiger „Eltern“ und „Kind“ Prozess bezeichnet. Leute könnten dich des Sexismus beschuldigen. – Thomas