理论
定义
进程 具有一定独立功能的程序的一次运行活动
特点
动态性
并发性
独立性
异步性
状态
就绪
执行
堵塞
概念
进程互斥
当有若干进程都要使用某一共享资源时,任何要使用该资源的进程必须等待,直到占有该资源这释放饿了该资源为止。
临界资源
操作系统一次只允许一个进程访问的资源
临界区
进程中访问临界资源的那带程序代码称为临界区
进程同步
*一组并发进程按一定的顺序的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号成为消息或事件
死锁
程序
getpid/getppid
函数 | pid_t getpid(void) |
---|
头文件 | #include<sys/types.h> #include<unistd.h> |
功能 | 获取本进程ID |
返回值 | 返回本进程ID |
函数 | pid_t getppid(void) |
---|
头文件 | #include<sys/types.h> #include<unistd.h> |
功能 | 获取父进程ID |
返回值 | 返父本进程ID |
fork
函数 | pid_t fork(void) |
---|
头文件 | #include<unistd.h> |
功能 | 创建子进程 |
返回值 | 父进程: 返回新创建的子进程PID ; 子进程: 返回 0 ; 失败: 返回 负值 |
注释 | 从fork()后将有 父进程和子进程共享后续代码段,但其数据段是独立的 两个进程执行顺序不定 |
vfork
函数 | pid_t vfork(void) |
---|
头文件 | #include<unistd.h> #inclde<sys/types.h> |
功能 | 创建子进程 |
返回值 | 父进程: 返回新创建的子进程PID ; 子进程: 返回 0 ; 失败: 返回 负值 |
注释 | 从fork()后将有 父进程和子进程共享后续代码段、数据段 先执行子进程,再进行父进程 |
exec函数族
函数 | int execl(const char* path , const char* arg1,... |
---|
头文件 | #include<unistd.h> |
功能 | 调用一个程序替换当前程序 不产生新程序,故PID不变 |
返回值 | 成功:不返回值, 失败:返回-1, 失败原因存于errno中 |
参数 | 属性 |
path | 调用的函数名(包含完整路径) |
arg-argn | 被执行程序所需的命令行参数,含程序名以空指针(NULL)结束 |
函数 | int execlp(const char* path , const char* arg1,... |
---|
头文件 | #include<unistd.h> |
功能 | 调用一个程序替换当前程序 不产生新程序,故PID不变 |
返回值 | 成功:不返回值, 失败:返回-1, 失败原因存于errno中 |
参数 | 属性 |
path | 调用的函数名(不含路径将从path环境变量中查找该程序) |
arg-argn | 被执行程序所需的命令行参数,含程序名以空指针(NULL)结束 |
函数 | int execv(const char* path , char* const argv[],... |
---|
头文件 | #include<unistd.h> |
功能 | 调用一个程序替换当前程序 不产生新程序,故PID不变 |
返回值 | 成功:不返回值, 失败:返回-1, 失败原因存于errno中 |
参数 | 属性 |
path | 调用的函数名(包含完整路径) |
argv[] | 被执行程序所需的命令行参数数组(包含侧程序名) |
system
函数 | int system(const char* string) |
---|
头文件 | #include<stdlib.h> |
功能 | 调用fork产生子进程,由子进程来调用/bin/sh -c string 来执行参数string 所代表的命令 |
返回值 | |
参数 | 属性 |
string | 调用的命令名) |
例程 | system("ls -al /ect/passwd") |
wait
函数 | pid_t wait(int* status) |
---|
头文件 | #include<sys/typesh> #include<sys/wait.h> |
功能 | 阻塞该进程,直到其某个子进程退出 |
返回值 | 成功: 返回被收集的子进程的进程ID 失败:(如果调用进程没有子进程) 返回 -1 同时errno被置为ECHILD。 |
参数 | 属性 |
int* status | 保存被收集进程退出时的一些状态/一般输入NULL |
例程 | system("ls -al /ect/passwd") |