免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5135 | 回复: 19
打印 上一主题 下一主题

Linux中脚本进程号由什么决定? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-21 19:35 |只看该作者 |正序浏览
平台是redhat as3,没事看shell的时候,用$$表示当前脚本pid,于是弄了个
test.sh
  1. echo $$
复制代码

加上可执行权限,执行一次,发现进程号加7,再执行一次,再加7,
请问高人,为什么每次执行进程号都是加7,而不是加什么别的数字呢?譬如1?

谢谢...

论坛徽章:
0
20 [报告]
发表于 2004-12-27 20:35 |只看该作者

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再次循环。

论坛徽章:
0
19 [报告]
发表于 2004-12-27 19:02 |只看该作者

Linux中脚本进程号由什么决定?

顶一下,回家...

论坛徽章:
0
18 [报告]
发表于 2004-12-27 12:10 |只看该作者

Linux中脚本进程号由什么决定?

顶起来...

论坛徽章:
0
17 [报告]
发表于 2004-12-27 08:57 |只看该作者

Linux中脚本进程号由什么决定?

原帖由 "thomassun"]  发表:

done

好办法,不过大哥,您这些while,ps等是否会影响到系统的pid呢,如果是的话,那就没用啦....
看我的执行结果....
[root@Server shell]# sh pid
  1. 1466
  2. [root@Server shell]# sh pid
  3. 1500
  4. UID        PID  PPID  C STIME TTY          TIME CMD
  5. UID        PID  PPID  C STIME TTY          TIME CMD
  6. UID        PID  PPID  C STIME TTY          TIME CMD
  7. UID        PID  PPID  C STIME TTY          TIME CMD
  8. UID        PID  PPID  C STIME TTY          TIME CMD
  9. UID        PID  PPID  C STIME TTY          TIME CMD
  10. [root@Server shell]# sh pid
  11. 1514
  12. UID        PID  PPID  C STIME TTY          TIME CMD
  13. UID        PID  PPID  C STIME TTY          TIME CMD
  14. UID        PID  PPID  C STIME TTY          TIME CMD
  15. UID        PID  PPID  C STIME TTY          TIME CMD
  16. UID        PID  PPID  C STIME TTY          TIME CMD
  17. UID        PID  PPID  C STIME TTY          TIME CMD
复制代码


[
  1. root@Server shell]# bash pid
  2. 1529
  3. UID        PID  PPID  C STIME TTY          TIME CMD
  4. UID        PID  PPID  C STIME TTY          TIME CMD
  5. UID        PID  PPID  C STIME TTY          TIME CMD
  6. UID        PID  PPID  C STIME TTY          TIME CMD
  7. UID        PID  PPID  C STIME TTY          TIME CMD
  8. UID        PID  PPID  C STIME TTY          TIME CMD
  9. [root@Server shell]# bash pid
  10. 1549
  11. UID        PID  PPID  C STIME TTY          TIME CMD
  12. UID        PID  PPID  C STIME TTY          TIME CMD
  13. UID        PID  PPID  C STIME TTY          TIME CMD
  14. UID        PID  PPID  C STIME TTY          TIME CMD
  15. UID        PID  PPID  C STIME TTY          TIME CMD
  16. UID        PID  PPID  C STIME TTY          TIME CMD


复制代码

有区别哦....
我改了一下这个脚本...按我的习惯来做的...
前面加了一个echo $pid1,看看当时状态...
  1. [root@Server shell]# cat pid
  2. #!/bin/bash
  3. pid7=$$
  4. pid1=`expr $pid7 - 6`
  5. echo $pid1
  6. while [ $pid1 -lt $pid7 ]
  7. do
  8.         ps -fp $pid1
  9. pid1=`expr $pid1 + 1`
  10. done
复制代码

论坛徽章:
0
16 [报告]
发表于 2004-12-25 17:24 |只看该作者

Linux中脚本进程号由什么决定?

ding

论坛徽章:
0
15 [报告]
发表于 2004-12-24 23:26 |只看该作者

Linux中脚本进程号由什么决定?

找出那多出来的6个进程是谁不就成了:
pid7=$$
pid1=$[pid7-6]
while [ pid1 -lt pid7 ]
do
ps -fp $pid1
pid1=$[pid1 + 1 ]
done

论坛徽章:
0
14 [报告]
发表于 2004-12-24 20:05 |只看该作者

Linux中脚本进程号由什么决定?

我不认为是这样,我每次在执行脚本里echo $$的时候都是加7(脚本里只有这一句),不变的,都是7,如果解释器指定为bash的话为7,而sh就是加1...
我感觉应该是在调用解释器的时候,解释器初始化中间可能不同,造成这些差异...

我感觉与其他进程无关...
虽然说可能是fork的次数不同,但是问题就在这里了....
为什么会出现这种情况,几种shell解释器在这里有什么区别呢?

论坛徽章:
0
13 [报告]
发表于 2004-12-24 19:00 |只看该作者

Linux中脚本进程号由什么决定?

原帖由 "寂寞烈火" 发表:
帮你顶!
P.S:一般来说shell接受一个命令,那么内核就产生一个进程供此命令运行,如果这个命令又衍生了(调用了)其它的某些"命令",那么进程数就应该有相应的变化!不知道我离解的对不对?
还望朋友们指点


应该说也有可能是0个或者是多个进程,与你fork的调用有关

论坛徽章:
0
12 [报告]
发表于 2004-12-24 18:55 |只看该作者

Linux中脚本进程号由什么决定?

进程号是由系统自己维护的,至于为什么加7,而不是1或者其它,有可能你还有后台在运行,比如cron等,此外不同shell对配置文件的处理不同,也有可能造成这样的区别
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP