注:这是之前学习进程概念和用法的笔记,作为学习记录,也希望多大家有点作用,若有错误也请纠正
一.进程
1.Linux是一个多任务的操作系统
进程就是一种任务,任务参与任务调度,在内核中一个任务用task_struct结构体表示
(2)进程号(PID)
每个进程用进程号作为唯一标识,PID由系统管理,PID是一个正整数,进程结束后PID可以重复使用,但是需要延迟重用
Linux提供了相关函数来获取进程号
(2)进程号(PID)
每个进程用进程号作为唯一标识,PID由系统管理,PID是一个正整数,进程结束后PID可以重复使用,但是需要延迟重用Linux提供了相关函数来获取进程号
getpid函数返回当前进程PID
getppid返回父进程的PID
4.进程的创建
(1)fork()
fork函数通过复制父进程创建一个子进程,子进程会复制父进程的进程空间,除了代码段(只读)共享以外,其他内存区域都会复制一份(写拷贝)
fork函数创建子进程之后,父子进程同时运行,先后顺序不确定,谁先结束也不确定
fork函数调用一次,返回2次,父子进程返回后都从fork函数的下一条语句开始运行,父进程返回子进程ID,子进程返回0
fork函数复制父进程产生子进程时,复制文件描述符,但是不复制文件表
fork函数复制父进程产生子进程时,输入输出缓冲区会复制
fork函数复制父进程产生子进程时,不复制文件锁
当进程结束的时候,会给父进程发送一个信号,让父进程来回收资源,如果子进程结束后没有发送父进程信号,或者父进程没有处理该信号,子进程变成僵尸进程
vfork()
vfork的形式和fork完全一样,区别在于vfork不复制父进程任何资源,vfork创建的子进程抢占父进程的资源,导致父进程阻塞,父进程解除阻塞的条件是:
子进程结束,归还父进程资源
使用其他函数(exec)替换子进程的内容,归还父进程的资源
注:子进程应该用exit函数退出
5.父进程等待子进程结束(回收资源)
wait系列函数可以让父进程等待子进程结束,回收子进程资源
wait函数让父进程等待任意一个子进程结束,返回子进程的PID,把子进程的退出状态和退出码放入status参数中
如果没有子进程结束,wait函数就会阻塞父进程,直到有子进程结束为止,wait函数也可以回收僵尸子进程 殓尸工
WIFEXITED(status)
返回真表示子进程正常退出
WEXITSTATUS(status)
返回子进程的退出码
WIFSIGNALED(status)
返回真表示子进程被信号打断