1.进程基本概念
进程:程序的运行状态。具有独立功能的程序的一次运行活动。
进程三态:就绪态、执行态和阻塞态,相互关系如下图:
进程互斥:当有若干进程都要使用某共享资源,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,知道占用该资源者释放了该资源。一次只允许一个进程访
问的资源称为临界资源。进程中访问临界资源的程序代码称为临界区。实现对临界资源的互斥访问的关键是保证进程互斥的进入各自的临界区。
进程同步:一组并发进程按一定的顺序执行的过程称为进程的同步。具有同步关系的并发进程称为合作进程,合作进程之间互相发送的信号称为消息或者事件。
进程调度:按一定的算法,从一组待运行的的进程中选择一个占有CPU。
进程死锁:多个进程因竞争资源而形成僵局,若无外力作用,这些进程将永不能进行下去。
2.linux进程控制编程
2.1获取ID
#include<sys/types.h>
#include<unistd.h>
pid_t getpid(void) //获取本进程ID
pid_t getppid(void) //获取父进程ID
2.2进程创建
#include<unistd.h>
pid_t fork(void)
fork调用一次返回两次,可能有三种不一样的返回值:
在父进程中,返回新创建的子进程的PID
在子进程中,返回0
出错,返回负值。
fork之后的程序,父进程和子进程同时运行。子进程拷贝父进程的数据段、堆栈空间,父进程与子进程共享fork之后的代码段。
#include<sys/types.h>
#include<unistd.h>
pid_t vfork(void)
与fork的区别:
fork:子进程拷贝父进程的数据段;父进程与子进程执行次序不确定
vfork:子进程共享父进程的数据段;子进程先运行,父进程后运行
2.3exec函数族
exec用被执行的程序替换调用它的程序,进程号不变。
#include<unistd.h>
int execl(const char *path,const char *arg1,...)
path:被执行的程序名(包含路径)
arg1--argn:执行程序需要的参数,包括程序名,已空指针NULL结束
类似的还有:
#include<unistd.h>
int execlp(const char *path,const char *arg1,...)
#include<unistd.h>
int execv(const char *path,const char *arg1[ ])
system函数:
#include<stdlib.h>
int system(const char *string)
string:需要运行的命令
2.4进程等待
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *status)
阻塞该进程,直到其某个子进程退出。