进程
进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元
程序是放到磁盘的可执行文件(静态的 永久的)
进程是指程序执行的实例 (正在执行的 是动态的 暂时的 )
chmod 希尔脚本本身没有执行权限 需要通过chmod添加可执行权限
文件可以迁移,但是进程不能迁移
进程的组成包括程序 数据 以及 PCB(进程控制块 即进程状态信息)
通过调用一个进程可以调用多个程序
每个进程都有生命周期
创建 运行 撤销
ps 查看进程
-e
-o
pid
ppid
用户进程
初始化进程 PID为1身份是用户进程 并且是所有进程的父进程
PID为0是系统进程
所有进程都是由父进程产生
pstree 进程树
任何一个进程都会经历僵尸进程这一个阶段
僵尸进程的产生和危害以及如何消除
父进程结束子进程没结束子进程会成为孤儿进程(无危害)
解决:找个继父 即初始化进程
守护进程 精灵进程
进程与进程之间是相互独立的 每个进程都是一个独立的运行单位,拥有各自的权利和责任
堆区可以扩展
进程ID(PID)标识进程的唯一数字
父进程的ID(PPID)
启动进程的用户ID(UID)
getpid()
getppid()
GID
eUID
进程互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用
其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止(排他)
临界资源
操作系统中将一次只允许一个进程访问的资源称为临界资源
临界资源肯定是共享资源,
访问临界区的那段程序代码称为临界区
同步
一组并发进程按照一定顺序执行的过程就称为进程同步
有同步关系的进程就称为合作进程
合作进程互相发送的信号称为消息或事件
进程调度
抢占式 非抢占式
#include
pid_t fork(void)
功能:创建子进程(父子进程创建完运行顺序随机)
fork 他被调用一次,会返回两次,并可能有三种不同的返回值
两次返回原因调用fork之后有两个进程,父子进程都需要返回
复制 共享
子进程复制了父进程的变量
返回-1 即创建失败
返回给父进程的是子进程ID
返回给子进程的是 0 (表示子进程没有下一级,即没有子进程)
pid_t pid = vfork()创建子进程
vfork 不会继承父进程的空间变量 当需要使用空间变量时与父进程共享(子进程先运行父进程后运行)
exit(0)结束进程
子进程vfork不一定是在子进程运行完才运行 但一定是子进程先运行
调用fork函数后,子进程和父进程的执行次序不确定,而调用vfork后,保证子进程会先运行,但是在调用exec或exit前会在父进程的空间中运行,在子进程调用exec或exit之后父进程才可能被调度运行,当子进程调用这两个函数中的任意一个时,父进程会恢复运行。
exec
区别:fork创建一个新的进程,产生一个新的PID
exec启动一个新程序,替换原有的进程,因此进程的PID不会改变
exec函数族 ——execvp
L:参数以列表的形式提供
V:参数以数组(向量)的方式提供
E:为新进程提供新的环境变量
P:在用户的绝对路径path下查找可执行文件,该文件必须在用户路径下,可以只指定程序文件名
system(const char * string)
功能:
调用fork产生子进程,由子进程来调用/bin/sh -c string 来执行参数string所代表的命令
进程等待
#include
#include
pid_t wait(int * status)
功能:
阻塞该进程,直到其某个子进程退出
wait出错(当没有子进程但调用了)
等的其实是第一个结束的子进程(某个表示的是不确定是哪个进程是第一个结束)
pid_t waitpid(pit_t pid,int * sataus,int options)//可以指定等哪一个子进程



