【1】进程
进程是一个抽象实体,当系统在执行某程序时,分配和释放的各种资源
进程是一个程序的一次执行的过程
【2】进程和程序的区别
进程:动态的,占用内存,占有系统分配资源,具有
进程,分级创建的,在启动流程最后。会加载init进程(liunx的第一个进程)其他所有进程都是从此开始
每一个PID表示唯一的一个进程,进程号是有限资源
【3】进程的相关操作
ps aux 显示进程的详细信息
进程状态:
S:睡眠态
s:表示有子进程
<:优先级较高
N:优先级较低
l:有链接
+:前台进程
R:运行态
Z:僵尸态
T:停止态
top:动态显示进程信息
NI:进程执行优先级
-20~19 其中-20优先级最高
renice:修改优先级(正在运行的)
renice 10 PID
chtrl +z 让程序进入停止态
fg 恢复停止态
bg 后台运行
在 程序或添加 & 让程序在后台运行
让程序以制定优先级运行
nice -3 ./a.out //让a.out以优先级为3来运行
kill -9 PID 杀死一个进程
【4】进程的类型
PCB进程控制块
每个进程单独占用4G的地址空间。它所属的线程共享这4G空间0-3G属于用户空间3-4G属于内核空间。
虚拟地址相当于将一小块内存扩大(映射)到4G的地址空间。保证了进程间的独立性。不会影响其他进程
【5】进程的创建
1---创建一个进程
#include <unistd.h> //所需头文件
pid_t fork(void);
功能:创建一个进程
参数:无
返回值:0:代表执行子进程
>0(创建的子进程pid):代表执行父进程
-1:代表创建进程出错
返回值类型 pid_t == int
执行顺序:父子进程同时抢占时间点,先运行那个不一定
fork:执行后,子进程几乎赋值父进程的全部内容,在执行上,从fork的下一句开始执行。这时候父子进程执行相同的代码,通过pid区分具体执行内容
子进程属于拷贝,只有子进程试图修改父进程集成过来的时间的时候,
2---获取id号
所需头文件
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);//当前进程的PID
pid_t getppid(void);//当前进程的父PID
3---结束一个进程
所需头文件
#include <stdlib.h>
void exit(int status);
功能:结束一个进程(检查缓冲区,如果有东西就刷新缓冲区)
参数:进程的结束状态,一般0表示正常结束,其他任何值表示异常结束
返回值:无
所需头文件
#include <unistd.h>
void _exit(int status);
功能:结束一个进程(不检查缓冲区,直接结束)
参数:进程的结束状态,一般0表示正常结束,其他任何值表示异常结束
返回值:无
【6】孤儿进程
孤儿进程:当父进程先于子进程退出,那么子进程就成为孤儿进程,此时,子进程被系统1号进程(init)收养。我们说这个进程为孤儿进程。
创建孤儿进程是为了方便进程一直在后台运行达到实时监听的效果(守护进行)
【7】僵尸进程
僵尸进程:子进程先于父进程退出,而父进程没有做处理。父进程没有退出的情况下,僵尸进程仍然占有一定的资源,所以僵尸进程是有一定的危害的,需要处理
所需头文件
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
功能:等待子进程的退出,接受子进程的退出状态
参数:status :一个整形的指针或者NULL用来保存子进程的退出状态,若为空表示忽略子进程的退出状态
返回值:如果为-1表示出错,正确返回子进程的进程号
pid_t waitpid(pid_t pid, int *sta‐
tus, int options);
功能:等待子进程退出
参数:pid =0 等待同一个进程组中任意进程退出
pid<-1 等待组id等于pid绝对值到的子进程退出
常用 :
pid=-1表示任何一个子进程退出
pid>0:表示等待专属的pid==PID进程的退出
status:同wait,子进程的退出状态
options
0:死等
WUNTRACED:在子进程被暂停时waitpid会返回
常用:WNOHANG:非阻塞等待,想要等待的子进程没有退出,那么waitpid也会返回,不会死等
返回值:失败 -1
如果是WNOHANG子进程没有退出返回0
如果子进程退出返回子进程的PID
wait(NULL)==waitpid(-1,NULL,0)
常用
waitpid(-1,NULL,WNOHANG);
判断退出的状态WEXITSTATUS宏命令
【8】exec
exec:函数提供了一种进程中启动另外一个程序的用
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
【9】
守护进程
ps -axj
tty 为?为守护进程