Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299181
  • 博文数量: 148
  • 博客积分: 4365
  • 博客等级: 上校
  • 技术积分: 1566
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:38
文章分类
文章存档

2014年(2)

2013年(45)

2012年(18)

2011年(1)

2009年(54)

2008年(28)

我的朋友

分类: LINUX

2009-02-20 20:34:36

关于进程的nice值: 内容来自与wiki百科
  Nice值是类操作系统中表示静态优先级的数值。每个进程都有自己的静态优先级,优先级高的进程得以优先运行。Nice值的范围是-20~+19,拥有Nice值越大的进程的实际优先级越小(即Nice值为+19 的进程优先级最小,为-20的进程优先级最大),默认的Nice值是0。由于Nice值是静态优先级,所以一经设定,就不会再被内核修改,直到被重新设定。Nice值只起干预CPU时间分配的作用,实际中的细节,由动态优先级决定。

 STAT值表示进程当前的状态,在ps命令的man手册里可以看到如下说明:

 Here are the different values that the s, stat and state output
 specifiers (header "STAT" or "S") will display to describe the state of
 a process.
 D    Uninterruptible sleep (usually IO)
 R    Running or runnable (on run queue)
 S    Interruptible sleep (waiting for an event to complete)
 T    Stopped, either by a job control signal or because it is being
      traced.
 W    paging (not valid since the 2.6.xx kernel)
 X    dead (should never be seen)
 Z    Defunct ("zombie") process, terminated but not reaped by its
      parent.

 For BSD formats and when the stat keyword is used, additional
 characters may be displayed:
 <    high-priority (not nice to other users)
 N    low-priority (nice to other users)
 L    has pages locked into memory (for real-time and custom IO)
 s    is a session leader
 l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
 +    is in the foreground process group

启动的新的进程最简单的方法时使用system函数

int system (const char* string)

其中string参数为要运行的命令,例如

#include <stdlib.h>
#include <stdio.h>

int main()
{
    printf("Running ps with system\n");
     system("ps ");
    printf("Done.\n");
    exit(0);
}

程序运行结果为
Running ps with system
  PID TTY          TIME CMD
 2827 pts/0    00:00:00 su
 2834 pts/0    00:00:00 bash
29556 pts/0    00:00:00 system1
29557 pts/0    00:00:00 ps
Done.

system函数实为启动一个shell,然后用这个shell运行所给参数命令,待system函数返回后,继续往下运行,故可以看到在ps命令的输出结果全部打印完毕后,看到最后的输出Done。
我们知道在运行命令时,后面加个"&"符号,可使此命令在后台运行,我们将程序中的system函数调用改为

system("ps &");

其余不变,输出结果变为
Running ps with system
Done.
[root@localhost]#   PID TTY          TIME CMD
 2827 pts/0    00:00:00 su
 2834 pts/0    00:00:00 bash
13922 pts/0    00:00:00 ps

注意标红的Done位置的提前,因为变为后台运行,所以不用等到system所启动的shell的返回,可以理解为程序变成了并发。因为system的调用需要时间,所以后面的Done先输出了,并返回了启动该程序的 shell,然后由system启动的ps命令才打印其输出。
因为system必须要启动一个shell,所以其效率不是很高,使用的频率也很少。


我们可以使用exec函数族来进行当前进程的进程替换。我们下面使用两个程序演示exec函数。
system1.c 程序:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    printf("This is in system1.c\n");
    system("ps ");
    printf("Done in system1.c\n");
    printf("pid is %d\n",getpid());
    exit(0);
}

system2.c 程序:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("This is in system2.c\n");
    printf("pid is %d\n",getpid());
    execv("system1",NULL);
    printf("Done in system2.c\n");
    printf("pid is %d\n",getpid());
    exit(0);
}

在system2.c中用execv函数,参数为system1程序,运行结果为:

This is in system2.c
pid is 14042
This is in system1.c
  PID TTY          TIME CMD
 2827 pts/0    00:00:00 su
 2834 pts/0    00:00:00 bash
14042 pts/0    00:00:00 system1
14043 pts/0    00:00:00 ps
Done in system1.c
pid is 14042

可以看到system2中调用了execv后,就被参数所指向的system1程序所替换,后面的“Done in system2.c\n”,并没有输出,而system1中所有语句均被执行,通过输出进程pid可以看到,从头到尾只有一个进程,并无新进程产生(不算system调用产生的shell)。
阅读(890) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~