一、进程相关概述
1、相关指令
ps -aux 查看所有进程
ps -aux|grep 进程 只会过滤出指定进程信息
top 指令类似Windows任务管理器
2、进程描述符 pid
pid = 0 称为交换进程 --进程调度
pid =1 init进程 --系统初始化
二、c程序的存储空间是如何分配的
从高地址到低地址 按如下顺序
命令行参数和环境变量:int main(int argc,char**argv)
栈空间:自定义的函数和其中局部变量
堆空间: malloc和calloc
未初始化的数据:bss段 int a[128];
初始化的数据 :数据段 int a =10;
正文 :代码段
三、fork函数的使用
getpid() 获得当前进程的pid
getppid()获得父进程的pid
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid1;
printf("father pid is %d\n",getpid());//与父进程的pid一样,只有父进程跑
pid1 = fork();
if(pid1 == -1)
{
perror("fork error");
}
printf("pid is %d\n",getpid());//父子进程都会跑
if(pid1==0)//子进程
{
printf("this child fork pid is %d\n",getpid());
}
if(pid1>0)//父进程
{
printf("this father fork pid is %d\n",getpid());
}
return 0;
}
四、vfork函数的使用
与fork函数的区别
1、直接使用父进程的存储空间,不拷贝
2、vfork保证子进程先运行,子进程调用exit后,父进程才运行
验证demo
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int cnt = 0;
int main()
{
pid_t pid;
pid = vfork();
if(pid==0)
{ while(1)
{
printf("this is child fork\n");
sleep(1);//防止刷屏
cnt++;
if(cnt == 3)
{
exit(0);
}
}
}
else if(pid > 0)
{
while(1)
{
printf("this is father cnt is %d\n",cnt);
sleep(1);
}
}
return 0;
}
五、wait函数
作用:用于等待子进程的退出,回收子进程退出时的状态,子进程状态不被回收就会变成僵尸(zombie)进程(僵死进程)
检查wait 所返回的终止状态的宏:
WIFEXITED(status) 正常终止子进程产生的状态 对于这种情况可使用WEXTSTATUS(status)
WIFSIGNALED(status) 异常终止子进程返回的状态 对于这种情况可使用WTERMSIG(status)
WIFSTOPPEDED(status) 当前暂停子进程返回的状态 对于这种情况可使用WSTOPSIG(status)
WIFCONTINUED(status)
demo验证
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int cnt = 0;
int main()
{
pid_t pid;
int status;
pid = fork();
if(pid==0)
{
while(1)
{
printf("this is child fork\n");
sleep(1);//防止刷屏
cnt++;
if(cnt == 3)
{
exit(3);
}
}
}
else if(pid > 0)
{
while(1)
{
//原型:pid_t wait(int *status)
//wait(NULL);//表示不关心子进程退出的状态
wait(&status);
printf("status is %d\n",WEXTSTATUS(status));//打印的值为3
printf("this is father cnt is %d\n",cnt);
sleep(1);
}
}
return 0;
}
waitpid 与 wait 的区别
pid_t waitpid(pid_t pid, int *status, int options);
options 参数会影响 父进程是否阻塞来等待子进程## 标题
六、孤儿进程
父进程如果不等待子进程的退出,在子进程之前就结束了自己的生命,此时子进程就叫做孤儿进程
linux 避免存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程