- 论坛徽章:
- 0
|
Linux中脚本进程号由什么决定?
linux下执行程序或是执行脚本可分为两个过程:fork,execve。其中fork过程是相同的,pid是在fork时分配的。do_fork()调用创建子进程时会调用get_pid()
分配一个pid。看一下get_pid()的代码(kernel/fork.c):
static int get_pid(unsigned long flags)
{
static int next_safe = PID_MAX;
struct task_struct *p;
int pid, beginpid;
if (flags & CLONE_PID)
return current->;pid;
spin_lock(&lastpid_lock);
beginpid = last_pid;
if((++last_pid) & 0xffff8000) {
last_pid = 300; /* Skip daemons etc. */
goto inside;
}
if(last_pid >;= next_safe) {
inside:
next_safe = PID_MAX;
read_lock(&tasklist_lock);
repeat:
if (flags & CLONE_PID)
return current->;pid;
spin_lock(&lastpid_lock);
beginpid = last_pid;
if((++last_pid) & 0xffff8000) {
last_pid = 300; /* Skip daemons etc. */
goto inside;
}
if(last_pid >;= next_safe) {
inside:
next_safe = PID_MAX;
read_lock(&tasklist_lock);
repeat:
for_each_task(p) {
if(p->;pid == last_pid ||
p->;pgrp == last_pid ||
p->;tgid == last_pid ||
p->;session == last_pid) {
if(++last_pid >;= next_safe) {
if(last_pid & 0xffff8000)
last_pid = 300;
next_safe = PID_MAX;
}
if(unlikely(last_pid == beginpid))
goto nomorepids;
goto repeat;
}
if(p->;pid >; last_pid && next_safe >; p->;pid)
next_safe = p->;pid;
if(p->;pgrp >; last_pid && next_safe >; p->;pgrp)
next_safe = p->;pgrp;
if(p->;tgid >; last_pid && next_safe >; p->;tgid)
next_safe = p->;tgid;
if(p->;session >; last_pid && next_safe >; p->;session)
next_safe = p->;session;
}
read_unlock(&tasklist_lock);
}
pid = last_pid;
spin_unlock(&lastpid_lock);
return pid;
nomorepids:
read_unlock(&tasklist_lock);
spin_unlock(&lastpid_lock);
return 0;
}
这是2.4内核的代码,最大进程号为32767,最小为300(0~299为系统保留),很显然在每次创建一个进程,pid会加1,达到最大时返回到300再次循环。 |
|