进程和程序:编写命令解释器 sh


Linux shell 的技巧

Linux 的进程模型

执行一个程序

创建一个进程

父进程和子进程的通信

fork exec wait exit

程序:存储在文件中的机器指令序列,一般由编译器将源代码编译成2进制格式的代码。

运行一个程序意味着将这个指令序列载入内存然后让CPU逐条执行这些指令

linux 中:一个可执行程序是一个机器指令及其数据的序列

一个进程是程序运行时的内存空间和设置

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

进程存在于用户空间==存放运行的程序和他们的一部分内存空间/

ps :查看用户空间的内容

PID:每个进程都有一个唯一标识它的数字。

每个进程都与一个终端相连,每个进程都有一个已运行的时间。

ps -a 

ps -la

ps -fa

ps -ax : 查看系统任务进程 To see every process on the system using BSD syntax

内核管理内存中的进程和磁盘上的文件。

文件包含数据,进程包含可执行代码。

进程:内存中的一些字节

Linux的内存分为系统空间和用户空间。进程存在于用户空间。内存实际上就是一个字节序列,或者一个很大的数组。

一个进程不一定要占一段连续的内存,就像文件在磁盘被分成小块,进程在内存池中也被分成小块。

进程也有保存分配到的内存页面的数据结构。

建立一个进程:类似建立一个磁盘文件,内核找到一些用来存放程序指令和数据的空闲内存页。

      内核还要建立数据结构来存放相应的内存分配情况和进程属性

shell 的三个主要功能

1.运行程序

2.管理输入和输出

3.可编程

shell 具备的功能:

1.运行一个程序

2.建立一个程序

3.等待exit()

一个程序在一个进程中运行--(进程=一些内存和内核中的相应的数据结构)

execvp将程序从磁盘载入进程以便它可以被运行。

内核将新程序载入到当前进程,替代当前进程的代码和数据。

在指定路径查找并执行一个文件 execvp

#include

extern char **environ;

int ret=execl(const char *path, const char *arg, ...);
int ret=execlp(const char *file, const char *arg, ...);
int ret=execle(const char *path, const char *arg, ...,  char * const envp[]);
int ret=execv(const char *path, char *const argv[]);
int ret=execvp(const char *file, char *const argv[]);

  path=路径名/文件名

  file=文件名

  arg=字符串数组

  ret:-1=失败

创建进程 fork

#include

pid_t ret=fork(void);

  ret: -1=失败,0=返回到子进程,其余=子进程PID给父进程


等待进程结束  wait

#include
#include

pid_t ret=wait(int *status);

  status=子程序运行结果

  ret:-1=失败,pid=结束进程的进程id

wait 的两个重要特征:

  1.wait 阻塞调用它的进程直到子进程结束

  2.wait 返回结束进程的PID

系统调用wait() 做了两件事,wait 暂停调用它的进程直到子进程结束,然后wait 取得子进程结束时传给exit的值

wai()执行两个操作:通知和通信。

wait 的重要特征:

1.wai阻塞调用它的进程直到子程序结束。

2.wait 返回结束进程的PID。

用进程编程:

函数和进程之间的相似性:

1.execvp/exit 就像call/return, exec/exit

2.全局变量和fork/exec

进程死亡:exit 和 _exit

  exit 是 fork 的你操作,进程通过调用exit来停止运行,fork创建新的进程,exit 删除进程。

  exit 刷新所有的流,然后调用atexit和 on_exit 注册的函数,执行当前系统定义的其他与exit相关的操作。

终止当前进程:_exit()

#include

void _exit(int status);

  statue=返回值

_exit 小结:终止当前进程并执行所有必须的清理工作

1.关闭所有文件描述符和目录描述符

2.将该进程的PID置为init进程的ID

3.如果父进程调用wait() 或者 waitpid 来等待子进程的结束,则通知父进程

4.向父进程发送SIGCHLD.

shell 是一种编程语言。

是一种编程语言解释器,这个解释器解释从键盘输入的命令,也解释存储在脚本中的命令序列。

1.sh的编程特征:变量,I/O和if。。then

  脚本包含的元素

    变量:脚本可以定义变量,用前缀 ¥ 取变量的值

    用户输入: read 命令告诉shell 从标准输入中读入一个字符串,可以用 read 来创建交互的脚本, 也可以从文件或者管道中读入数据

    控制:if..then..ekse..fi,while, case, for .

    环境:脚本可以使用全局变量,如 HOME (主目录路径)

相关