1. 引言

一个程序是存储在文件中的机器指令序列。一般它是由编译器将源代码编译成二进制格式的代码。运行一个程序意味着将这个机器指令序列载入内存然后让处理器(cpu)逐条执行这些指令。

在Unix术语中,一个可执行程序是一个机器指令及其数据的序列。一个进程是程序运行时的内存空间和设置。

数据和程序存储在磁盘文件中,程序在进程中运行。

2. ps

进程存在于用户空间。用户空间是存放运行的程序和它们的数据的一部分内存空间。

使用ps(process status)命令可以查看用户空间的内容。这个命令会列出当前的进程。

用户空间容纳进程

ps
ps -a
ps -l

文件系统容纳文件和目录

ls
ls -a
ls -l

ps

 PID TTY          TIME CMD
2658 pts/0 00:00:00 bash
2954 pts/0 00:00:00 ps

这个有两个进程在运行:bash(shell)和ps命令。每个进程都有一个可以唯一标识它的数字,被称为进程ID。一般简称为PID。每一个进程都与一个终端相连,这里是/dev/pts/0。每个进程都有一个已运行的时间。注意ps对已运行时间统计并不是非常的精确,从ps只用了0秒就可以看出。

ps -a

ps有很多可选项。和ls命令一样,ps支持-a可选项。-a选项列出所有进程,包括在其他终端由其他用户运行的程序。但是带选项-a的输出并不包括shell。ps也有一个-l选项来打印更多细节:

ps -l

[purple@localhost 0820]$ ps -la
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 500 3002 2658 0 80 0 - 1170 - pts/0 00:00:00 ps

名为S的一列表示各个进程的状态。S列的值为R说明ps对应的进程正在运行。如果有其他进程的S列的值为S,说明它们都处于睡眠状态。每个进程都属于相应地UID列指明的用户ID。每个进程都有一个进程ID(PID),同时也有一个父进程ID(PPID)。

标记为PRI和NI的列分别是进程的优先级和niceness级别,内核根据这些值来决定什么时候运行进程。一个进程可以增加niceness级别,这就像在超市排队付账的时候,让其他客户排到自己的前面。超级用户可以减少它的niceness级别,这就像排队的时候插队。

一个进程有大小,这由SZ列表示。这列的数据表示这个进程占用的内存大小。

WCHAN列显示进程睡眠的原因。

ADDR和F已经不在使用,但是为了兼容的原因而保留它们。

ps –fa

[purple@localhost 0820]$ ps -fa
UID PID PPID C STIME TTY TIME CMD
purple 3095 2658 0 20:40 pts/0 00:00:00 ps -fa

-f表示格式化输出,这样便于阅读。用用户名代替UID来显示。在CMD列显示完整的命令行

3. 进程

建立一个进程有点像建立一个磁盘文件。内核要找到一些用来存放程序指令和数据的空闲内存页。内核还要建立数据结构来存放相应的内存分配情况和进程属性。

是操作系统变得神奇的不仅是它的文件系统把一堆旋转圆盘上连续的簇变成有序组织的树状目录结构,并且以相似的机制,它的进程系统将硅片上的一些位组织成一个进程社会。

4. shell

shell是一个管理进程和运行程序的程序。所有常用的shell都有三个主要的功能:

1. 运行程序

grep、date、ls、echo和mail都是一些普通的程序,用c编写,并被编译成机器语言。shell将它们载入内存并运行它们。很多人把shell看成是一个程序启动器(program launcher)。

2. 管理输入和输出

shell不仅仅是运行程序。使用<、>和|符号可以将输入、输出重定向。这样就可以告诉shell将进程的输入和输出连接到一个文件或是其他的进程。

3. 可编程

5. shell如何运行程序

一个shell 的主循环执行下面的4步:

1. 用户键入a.out

2. shell建立一个新的进程来运行这个程序

3. shell将程序从磁盘载入

4. 程序在它的进程中运行直到结束

因此为了要写一个shell,需要学会

1. 运行一个程序

2. 建立一个进程

3. 等待exit()

LINUX进程控制的更多相关文章

  1. Linux进程控制(二)

    1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h&g ...

  2. Linux进程控制(一)

    1. Linux进程概述 进程是一个程序一次执行的过程,它和程序有本质区别.程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度 ...

  3. Linux - 进程控制 代码(C)

    进程控制 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy 输出进程ID.getpid(). 代码: /*By C.L.Wang * Eclipse CDT ...

  4. Linux 进程控制

    分享知乎上看到的一句话,共勉: 学习周期分为学习,思考,实践,校正四个阶段,周期越短,学习效率越高. 前面讲的都是操作系统如何管理进程,接下来,看看用户如何进行进程控制. 1.进程创建 先介绍一下函数 ...

  5. Linux进程控制(三)

    1. 进程间打开文件的继承 1.1. 用fork继承打开的文件 fork以后的子进程自动继承了父进程的打开的文件,继承以后,父进程关闭打开的文件不会对子进程造成影响. 示例: #include < ...

  6. Linux进程控制——exec函数族

    原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是 ...

  7. linux进程控制命令

    & 加在一个命令的最后,可以把这个命令放到后台执行 ,如gftp &. ctrl + z 可以将一个正在前台执行的命令放到后台,并且处于暂停状态,不可执行. jobs 查看当前有多少在 ...

  8. linux 进程控制笔记

    进程创建 普通函数调用完成后,最多返回(return)一次,但fork/vfork会返回二次,一次返回给父进程,一次返回给子进程 父进程的返回值为子进程的进程ID,子进程的返回值为0 1.pid_t ...

  9. linux进程控制开发实例

    fork.c #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include < ...

随机推荐

  1. hdu 1873 看病要排队

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1873 看病要排队 Description 看病要排队这个是地球人都知道的常识.不过经过细心的0068的 ...

  2. 基于Elasticsearch进行地理检索,计算距离值

      实现步骤: 1.定义属性     [Serializable]     public class Coordinate     {         public double Lat { get; ...

  3. Linux I/O总结

    文件流 标准I/O文件流可用于单字节或多字节字符集.流的定向决定了所读写的是单字节还是多字节.流在最初创建时,并没有定向,此时如果在为定向的流上使用多字节I/O函数,那么该流被设置为宽定向的:如果在为 ...

  4. Entity Framework 泛型使用

    因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了.我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类.那就要求我们的父类必须使用泛型来实现. ...

  5. action属性

    action属性 2013年7月8日 14:52 Path: action的访问路径,以"/"开头 Type: action的类型 Name: action使用的actionFor ...

  6. [转] Matlab中给信号加高斯白噪声的方法

    MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = ...

  7. github 使用体会

    开始使用git: 在本机上安装git,听一些同学说他们当时用的是github的中文版即oschina开源中国,似乎操作更加简便一些,还可以安装tortoisegit,是一个gui界面.不过我想用习惯了 ...

  8. 代码复用 -- 深入了解javascript

    /* 代码复用 */ /* 一.避免 */ /* 模式1:默认模式 */ function Parent() { this.name = "123"; } Parent.proto ...

  9. Oracle数据库中文乱码问题

    最近碰到Oracle乱码问题,刚开始甚是头疼,以前在合肥出差的时候,这种问题也碰到过,当时直接抛给了“乌压压一片”(一个搞数据的同事儿),这次没办法躲过,只好硬着头皮上.虽然我这次碰到的是Oracle ...

  10. 记codevs第一次月赛

    第一次参加这种有奖励的比赛(没错,我就是为猴子而去的 一年没怎么碰代码果然手生,还是用没写多久的C++,差点全跪了 T1数学奇才琪露诺: 首先定义一个函数F(x),F(x)=x的各个数位上的数字和 然 ...