当前位置: 技术问答>linux和unix
linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
来源: 互联网 发布时间:2017-01-26
本文导语: 本帖最后由 gqb666 于 2011-12-19 11:36:53 编辑 562 if (clone_flags & CLONE_PID){ 563 /* This is only allowed from the boot up thread */ 564 if (current->pid) 565 return -EPERM; 566 } 上述代码定义在kernel/fork.c中,小弟在...
563 /* This is only allowed from the boot up thread */
564 if (current->pid)
565 return -EPERM;
566 }
上述代码定义在kernel/fork.c中,小弟在阅读linux2.4内核时查阅毛德操前辈的《linux内核源代码情景分析》一书282页第三段指出-只有0号进程,也就是系统中的原始进程(实际上是线程),才能允许带CLONE_PID的参数来共享父进程的PID,难到意思是调用后可以有两个0号进程(线程)吗?小弟不明白,请大侠们指教?
|
CLONE_PID的含义是同一进程下的所有线程需要共享该进程的id,以便实现内存、数据等的共享;
由于LINUX并不支持真正意义上的多线程,所以这个参数就基本无用;
仅在0进程下,认可参数CLONE_PID。实际上,仅在多CPU初始化、手工创建线程的时候才会使用CLONE_PID参数。
空线程在为第一个CPU引导时创建,然后依靠定义在arch/i386/kernel/smpboot.c的fork_by_hand()函数手工为每个CPU创建这个线程。所有的空线程共享一个init_task结构,但都拥有各自的存放在CPU队列里的init_tss表示的TSS结构。他们以CLONE_PID方式clone,PID都为零,其他任务都不能共享这个PID。
由于LINUX并不支持真正意义上的多线程,所以这个参数就基本无用;
仅在0进程下,认可参数CLONE_PID。实际上,仅在多CPU初始化、手工创建线程的时候才会使用CLONE_PID参数。
空线程在为第一个CPU引导时创建,然后依靠定义在arch/i386/kernel/smpboot.c的fork_by_hand()函数手工为每个CPU创建这个线程。所有的空线程共享一个init_task结构,但都拥有各自的存放在CPU队列里的init_tss表示的TSS结构。他们以CLONE_PID方式clone,PID都为零,其他任务都不能共享这个PID。