kernel---进程创建研究之 fork()
来源:互联网 发布:淘宝联盟5.0 编辑:程序博客网 时间:2024/06/06 10:40
首先提取出do_fork(),
from linux/kernel/fork.c
/* * Ok, this is the main fork-routine. * * It copies the process, and if successful kick-starts * it and waits for it to finish using the VM if required. */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){struct task_struct *p;int trace = 0;long nr;/* * Do some preliminary argument and permissions checking before we * actually start allocating stuff */if (clone_flags & CLONE_NEWUSER) {if (clone_flags & CLONE_THREAD)return -EINVAL;/* hopefully this check will go away when userns support is * complete */if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SETUID) ||!capable(CAP_SETGID))return -EPERM;}/* * We hope to recycle these flags after 2.6.26 */if (unlikely(clone_flags & CLONE_STOPPED)) {static int __read_mostly count = 100;if (count > 0 && printk_ratelimit()) {char comm[TASK_COMM_LEN];count--;printk(KERN_INFO "fork(): process `%s' used deprecated ""clone flags 0x%lx\n",get_task_comm(comm, current),clone_flags & CLONE_STOPPED);}}/* * When called from kernel_thread, don't do user tracing stuff. */if (likely(user_mode(regs)))trace = tracehook_prepare_clone(clone_flags);p = <span style="color:#FF0000;">copy_process</span>(clone_flags, stack_start, regs, stack_size, child_tidptr, NULL, trace);/* * Do this prior waking up the new thread - the thread pointer * might get invalid after that point, if the thread exits quickly. */if (!IS_ERR(p)) {struct completion vfork;trace_sched_process_fork(current, p);nr = task_pid_vnr(p);if (clone_flags & CLONE_PARENT_SETTID)put_user(nr, parent_tidptr);if (clone_flags & CLONE_VFORK) {p->vfork_done = &vfork;init_completion(&vfork);}audit_finish_fork(p);tracehook_report_clone(regs, clone_flags, nr, p);/* * We set PF_STARTING at creation in case tracing wants to * use this to distinguish a fully live task from one that * hasn't gotten to tracehook_report_clone() yet. Now we * clear it and set the child going. */p->flags &= ~PF_STARTING;if (unlikely(clone_flags & CLONE_STOPPED)) {/* * We'll start up with an immediate SIGSTOP. */sigaddset(&p->pending.signal, SIGSTOP);set_tsk_thread_flag(p, TIF_SIGPENDING);__set_task_state(p, TASK_STOPPED);} else {wake_up_new_task(p, clone_flags);}tracehook_report_clone_complete(trace, regs,clone_flags, nr, p);if (clone_flags & CLONE_VFORK) {freezer_do_not_count();wait_for_completion(&vfork);freezer_count();tracehook_report_vfork_done(p, nr);}} else {nr = PTR_ERR(p);}return nr;}
call copy_process( );
在此函数中有几个重要函数的调用:
(1)dup_task_struct( );
在copy_process( )中调用形式为p = dup_task_struct(current);
current为当前进程描述符。
static struct task_struct *dup_task_struct(struct task_struct *orig){struct task_struct *tsk;struct thread_info *ti;unsigned long *stackend;int err;prepare_to_copy(orig);<span style="color:#FF0000;">tsk = alloc_task_struct();</span>if (!tsk)return NULL;<span style="color:#FF0000;">ti = alloc_thread_info(tsk);</span>if (!ti) {free_task_struct(tsk);return NULL;} err = arch_dup_task_struct(tsk, orig);if (err)goto out;tsk->stack = ti;err = prop_local_init_single(&tsk->dirties);if (err)goto out;setup_thread_stack(tsk, orig);clear_user_return_notifier(tsk);stackend = end_of_stack(tsk);*stackend = STACK_END_MAGIC;/* for overflow detection */#ifdef CONFIG_CC_STACKPROTECTORtsk->stack_canary = get_random_int();#endif/* One for us, one for whoever does the "release_task()" (usually parent) */atomic_set(&tsk->usage,2);atomic_set(&tsk->fs_excl, 0);#ifdef CONFIG_BLK_DEV_IO_TRACEtsk->btrace_seq = 0;#endiftsk->splice_pipe = NULL;account_kernel_stack(ti, 1);return tsk;out:free_thread_info(ti);free_task_struct(tsk);return NULL;}
函数中复制了进程描述符
# define alloc_task_struct() kmem_cache_alloc(task_struct_cachep, GFP_KERNEL)
static inline struct thread_info *alloc_thread_info(struct task_struct *tsk)
{
#ifdef CONFIG_DEBUG_STACK_USAGE
gfp_t mask = GFP_KERNEL | __GFP_ZERO;
#else
gfp_t mask = GFP_KERNEL;
#endif
return (struct thread_info *)__get_free_pages(mask, THREAD_SIZE_ORDER);
}
0 0
- kernel---进程创建研究之 fork()
- linux之fork,vfork创建子进程
- 进程创建函数之fork()和vfork()
- Linux进程创建之fork()函数
- Linux进程创建之fork()v与fork()
- Linux进程创建之fork与进程状态
- Linux进程-fork创建新进程之文件分析
- 创建进程fork
- 创建进程库函数fork
- fork() 创建新进程
- 创建进程库函数fork
- python 创建进程fork
- fork创建子进程
- fork创建进程
- 关于fork 创建进程
- Linux:fork进程创建
- fork进程创建
- fork创建进程
- OpenGL 显示汉字,别的地方摘录
- 怎样手工root android系统
- android 分析内存泄漏
- 后缀数组——处理字符串的有力工具
- c语言的文件操作
- kernel---进程创建研究之 fork()
- 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
- Monkey 自动测试工具详细介绍
- 用GDB调试程序
- value_type, key_type, mapped_type, reference,const_reference
- poj 3061 Subsequence(尺取法)
- 常见排序方法
- Android 视差滚动控件
- 交互中的模态与非模态