进程和程序:编写命令解释器 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 (主目录路径)