日期:2014-05-16  浏览次数:20570 次

linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
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中,小弟在阅读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。