1.进程的三种状态:
①运行:要么在CPU上执行,要么等待被执行,最终被内核调度。
②停止:被挂起,不会被调度。收到SIGSTP,SIGSTOP,SIGTTIN,SIGTTOUT等信号时,进程停止直到收到SIGCONT。
③终止:收到一个信号/从主程序返回/调用exit
#include <stdlib.h>
void exit( int status);//status是退出状态
2.创建一个新的子进程fork():
- 相同但是独立的地址空间:子进程得到与父进程虚拟地址空间相同(但是独立)的一份拷贝(文本、数据和bss段、堆、用户栈),打开文件描述符的拷贝。PID不同。
- 调用一次,返回给父进程(PID)和子进程(0)各一次。
- 父进程、子进程并发执行
- 共享文件
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);//子进程返回0,父进程返回子进程PID,出错返回-1
3.回收子进程:
- 进程终止->僵死进程->回收抛弃
- 如果父进程没有回收子进程就终止,init进程(PID=1)来回收
- 进程可以waitpid等待子进程终止或停止:
①options=0,挂起调用进程,等集合中一个子进程终止为止,返回PID。
②pid=-1,集合中所有子进程
③options=WNOHANG:默认挂起,但是立即返回(没有子进程终止,返回0),等的同时可以做别的事
④options=WUNTRACED:挂起,集合中一个子进程终止/停止(返回PID)
⑤options=WNOHANG|WUNTRACED:立即返回,不等,有终止/停止返回PID,没有返回0
⑥调用进程没有子进程:-1,errno=ECHILD,waitpid被信号中断:-1,errno=EINTR
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status,int options);//成功:子进程PID,WNOHANG:0,其他error:-1
4.检查回收子进程的退出状态:
WIFEXITED(status):eixt或return正常终止
WEXITSTATUS(status):正常终止子进程退出状态
WIFSIGNALED(status):未被捕获的信号而终止
WTERMSIG(status):导致子进程终止的信号编号
WIFSTOPPED(status):子进程停止
WSTOPSIG(status):引起子进程停止的信号数量
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int* status);
//等价于waitpid(-1,&status,0)
5.让进程休眠:
sleep():进程挂起一段时间,时间到了返回0,否则剩余秒数(可能被信号中断)
#include <unistd.h>
usigned int sleep(unsigned int secs);
pause():挂起直到收到一个信号
#include <unistd.h>
int pause(void);
6.加载并允许一个程序fork() execve()
当前进程上下文中加载并允许一个程序,覆盖当前地址空间,没有新进程
#include <unistd.h>
int execve(const char *filename, const char *argv[], const char *envp[]);//成功不返回,错误-1
总结自《深入理解计算机系统第2版》