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

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

(2011-08-28 05:17:57)

标签:

杂谈

Linux中脚本进程号由什么决定?平台是redhat as3,没事看shell的时候,用$$表示当前脚本pid,于是弄了个

test.sh

[code]echo $$[/code]

加上可执行权限,执行一次,发现进程号加7,再执行一次,再加7,

请问高人,为什么每次执行进程号都是加7,而不是加什么别的数字呢?譬如1?

谢谢...Linux中脚本进程号由什么决定?如果在第一行加上

#!/bin/sh

那么执行的效果是每次执行PID加1,如果是#!/bin/bash,那么每次执行则是PID加7

小弟愚笨,请高手赐教...Linux中脚本进程号由什么决定?我用的是redhat9,代码同你的,每次只加1Linux中脚本进程号由什么决定?昏,为什么呢?呵呵...

你的bash什么版本?Linux中脚本进程号由什么决定?[quote][i]原帖由

"双眼皮的猪" 发表:[/i]

昏,为什么呢?呵呵...

你的bash什么版本?[/quote]

GNU bash, version 3.00.0(1)-release (i686-pc-linux-gnu)

Copyright (C) 2004 Free Software Foundation, Inc.

P.S:redhat 9.0Linux中脚本进程号由什么决定?弓虽,zippo俺的是2.05b的...

还是不知道为什么,烈火大哥能否解释一下?

bash启动的时候都执行了哪些东西?PID加7啊,真多...

若是sh,pid+1

bash,pid+7

bash2,pid+7

csh,pid+22

ksh,pid+1

zsh不知道..Linux中脚本进程号由什么决定?ding....Linux中脚本进程号由什么决定?帮你顶!

P.S:一般来说shell接受一个命令,那么内核就产生一个进程供此命令运行,如果这个命令又衍生了(调用了)其它的某些"命令",那么进程数就应该有相应的变化!不知道我离解的对不对?

还望朋友们指点 :-)Linux中脚本进程号由什么决定?我只是echo $$啊

我觉得应该是解释器在初始化过程中可能做过什么东东....

譬如bash,csh等在初始化的时候可能就不同...Linux中脚本进程号由什么决定?顶一顶

。。。沉的好快啊Linux中脚本进程号由什么决定?[quote][i]原帖由

"双眼皮的猪"]顶一顶 。。。沉的好快啊[/quote

发表:[/i]

呵呵http://www.the9ti.info/guanyuwomen/603.html,继续顶!

:em11:Linux中脚本进程号由什么决定?进程号是由系统自己维护的,至于为什么加7,而不是1或者其它,有可能你还有后台在运行,比如cron等,此外不同shell对配置文件的处理不同,也有可能造成这样的区别Linux中脚本进程号由什么决定?[quote][i]原帖由

"寂寞烈火" 发表:[/i]

帮你顶!

P.S:一般来说shell接受一个命令,那么内核就产生一个进程供此命令运行,如果这个命令又衍生了(调用了)其它的某些"命令",那么进程数就应该有相应的变化!不知道我离解的对不对?

还望朋友们指点 :-)[/quote]

应该说也有可能是0个或者是多个进程,与你fork的调用有关Linux中脚本进程号由什么决定?我不认为是这样,我每次在执行脚本里echo

$$的时候都是加7(脚本里只有这一句),不变的,都是7,如果解释器指定为bash的话为7,而sh就是加1...

我感觉应该是在调用解释器的时候,解释器初始化中间可能不同,造成这些差异...

我感觉与其他进程无关...

虽然说可能是fork的次数不同,但是问题就在这里了....

为什么会出现这种情况,几种shell解释器在这里有什么区别呢?Linux中脚本进程号由什么决定?找出那多出来的6个进程是谁不就成了:

pid7=$$

pid1=$[pid7-6]

while [ pid1 -lt pid7 ]

do

ps -fp $pid1

pid1=$[pid1 + 1 ]

doneLinux中脚本进程号由什么决定?dingLinux中脚本进程号由什么决定?[quote][i]原帖由

"thomassun"]发表:[/i]

done[/quote]

好办法,不过大哥,您这些while,ps等是否会影响到系统http://www.kti8tsite.info/gongsi/575.html的pid呢,如果是的话,那就没用啦....

看我的执行结果....

[root@Server shell]# sh pid

[code]1466

[root@Server shell]# sh pid

1500

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

[root@Server shell]# sh pid

1514

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD[/code]

[[code]root@Server shell]# bash pid

1529

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

[root@Server shell]# bash pid

1549

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

UID PIDPPIDC STIME TTY TIME CMD

[/code]

有区别哦....

我改了一下这个脚本...按我http://www.ki7site.info/guanyuwomen/570.html的习惯来做的...

前面加了一个echo $pid1,看看当时状态...

[code][root@Server shell]# cat pid

#!/bin/bash

pid7=$$

pid1=`expr $pid7 - 6`

echo $pid1

while [ $pid1 -lt $pid7 ]

do

ps -fp $pid1

pid1=`expr $pid1 + 1`

done

[/code]Linux中脚本进程号由什么决定?顶起来...Linux中脚本进程号由什么决定?顶一下,回家...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;

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;

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;

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值