什么是进程?
进程是程序中的代码和数据,被加载到内存中运行的过程
进程的复刻(fork)知识点
1、父子进程的生成
父进程调用fork(),将当前进程一分为二,一个称为父进程,一个称为子进程,其中的相同点和不同点分别为:
父子进程哪些属性完全一样
1、实际的UID和GID,以及有效UID和GID
2、所有环境变量
3、进程组ID和会话ID
4、当前工作路径
5、打开的文件
6、信号响应函数
7、整个内存空间
父子进程不一样的
1、进程号PID。PID的身份证号码,哪怕是父子也要区分
2、进程锁
3、挂起的信号
2、父子进程的判断(判断哪个是父进程,哪个是子进程)
父子进程是并发执行的,没有先后次序,若要控制次序,需要依赖于信号量、互斥锁、条件量等其他条件。fork()的返回值来确定是子进程还是父进程,如果返回值大于零,那么返回值就是子进程的PID,(进入父进程)并且可以通过getpid()函数来获取该进程的PID;如果返回值等于零,(进入子进程)可以通过getpid()函数获取该进程的PID,通过getppid()获取该进程的父进程的PID;
进程涉及的基本函数
1、进程的退出函数
exit(0);会回收资源
_Exit(0),_exit();立即退出,不会回收资源,(不会冲刷缓冲区)
2、进程的回收函数及用宏判别回收时的状态
1、回收函数
wait(&status);等待所有子进程,并且可以接收子进程的退出信息,成功返回子进程的PID,失败返回-1;
waitpid(PID,&status,options)等待指定PID,options 参数用于修改 waitpid() 的行为;
2、宏的判断
WIFEXITED(status): 如果子进程正常结束,返回非零值。
WEXITSTATUS(status): 如果 WIFEXITED 返回真,这个宏返回子进程的退出码(一个0到255之间的整数)。
WIFSIGNALED(status): 如果子进程由于接收到一个未被捕获的信号而终止,返回非零值。
WTERMSIG(status): 如果 WIFSIGNALED 返回真,这个宏返回导致子进程终止的信号的编号。
WIFSTOPPED(status): 如果子进程当前处于停止状态(因为接收到一个信号),返回非零值。
WSTOPSIG(status): 如果 WIFSTOPPED 返回真,这个宏返回导致子进程停止的信号的编号。
3、exec系列函数的使用(举例部分)
execl("/bin/ls","ls","-l",NULL);//从左向右参数依次为:命令路径、命令、具体命令实现
execlp("ls","ls","-l",NULL)://该函数与上述函数效果一样,只不过无需再手动找命令路径
char *str[]={"ls","-l",NULL}; execv("ls",str);//该函数利用数组传参,跟execl相似