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 5265 pog loves szh II

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5265 pog loves szh II Description Pog and Szh are pla ...

  2. android开发系列之由ContentValues看到的

    这本篇博客里面我想重点来分析一下ContentValues的源码以及它里面涉及到的继承接口Parcelabel,还有HashMap的源码. 相信使用过android里面数据库操作的朋友对于Conten ...

  3. 5.Knockout.Js(自定义绑定)

    前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...

  4. Go返回参数命名

    Go语言中可以为返回值定义名称.代码实例: package main import "fmt" func add1(a int, b int) int { return a + b ...

  5. Pintos修改优先级捐赠、嵌套捐赠、锁的获得与释放、信号量及PV操作

    Pintos修改优先级捐赠.嵌套捐赠.锁的获得与释放.信号量及PV操作 原有的优先级更改的情况下面没有考虑到捐赠的情况,仅仅只是改变更改了当前线程的优先级,更别说恢复原本优先级了,所以不能通过任何有关 ...

  6. 安装ubuntu时将boot目录单独挂载的意义

    只有一个意义那就是当你的情况是:单个硬盘里面安装多个系统. 如果不是这样,就别动它.

  7. Asp.Net MVC3(三)-MvcApp实现全局异常捕获

    定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...

  8. 【每日scrum】NO.5

    尝试采用自己的地图,绘点并计算路径,但是地图打开出现问题.

  9. multipart/form-data

    Content-Type的类型扩充了multipart/form-data用以支持向服务器发送二进制数据

  10. Mac系统如何配置adb

    在使用mac进行android开发之前,我们一般会安装android studio 或者 eclipse,无论哪一款开发软件,都少不了安装adb(Android Debug Bridge).adb(A ...