- 论坛徽章:
- 0
|
sys_clone(),sys_fork(),sys_vfork()和sys_thread()都是要调用do_fork()的。
long do_fork(unsigned long clone_flags,//第1参数
unsigned long stack_start,//第2参数
struct pt_regs *regs,//第3参数
unsigned long stack_size,//第4参数
int __user *parent_tidptr,//第5参数
int __user *child_tidptr)//第6参数
第1参数:标志位。最后一个字节是进程结束时返回给父进程的信号。
第2参数:新的栈指针。(0:当前栈指针)
第3参数:指向保存有要传给do_fork函数的寄存器值的栈地址
第4参数:栈大小。
第5参数:父进程地址空间。
第6参数:子进程地址空间。
clone_flages是以下值的或组合
CLONE_VM 0x00000100 子进程与父进程共享mm_struct
CLONE_FS 0x00000200 子进程与父进程共享fs_struct
CLONE_FILES 0x00000400 子进程与父进程共享files_struct
CLONE_SIGHAND 0x00000800 子进程与父进程共享signal_struct,sighand_struct
CLONE_PTRACE 0x00002000 父进程如果被ptrace,则子进程也被ptrace
CLONE_VFORK 0x00004000 子进程的mm_struct被mm_relase之前,父进程不动作
CLONE_PARENT 0x00008000 子进程与父进程有同一个父进程
CLONE_THREAD 0x00010000 子进程与父进程同属一个线程组
CLONE_NEWNS 0x00020000 子进程与父进程不共享namespace
CLONE_SYSVSEM 0x00040000 子进程于父进程共享system V semaphore的undo list(sem_undo)
CLONE_SETTLS 0x00080000 根据第3个参数值,为子进程设置TLS
CLONE_PARENT_SETTID 0x00100000 在第5个参数所指定的父进程地址里写入父进程ID
CLONE_CHILD_CLEARTID 0x00200000 子进程结束时,在第6个参数所指定的子进程地址里写入0
CLONE_DETACHED 0x00400000 不用
CLONE_UNTRACED 0x00800000 强制解除父进程的ptrace
CLONE_CHILD_SETTID 0x01000000 子进程动作时,在第6个参数所指定的子进程地址里写入子进程ID
CLONE_STOPPED 0x02000000 子进程生成时处于TASK_STOPPED状态
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/91477/showart_1855089.html |
|