进程
-
程序和进程的def
- 程序是静态的概念。
- 进程是程序的一次运行活动,俗称,程序跑起来了
-
如何查看系统中有哪些进程
- 使用PS指令查看
- ps-aux查看所有进程
- 一般用grep配合PS指令,来查看自己需要的进程
- 使用PS指令查看
-
什么是进程标识符
- 每个进程都有一个非负整数表示的唯一ID,叫做pid。
- pid=0:交换进程
- 作用:进程调度
- pid=1:init进程
- 作用:系统初始化
- pid=0:交换进程
- 每个进程都有一个非负整数表示的唯一ID,叫做pid。
-
getpid():可以获取进程号
-
getppid():可以获取父进程号
-
c程序的存储空间的分配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXGJWbX2-1647508043157)(C:\Users\27670\AppData\Roaming\Typora\typora-user-images\image-20220227164323539.png)]
- 正文(代码段):流程控制,各种算法
- 初始化的数据(数据段):初始化的数据
- 未初始化的数据(bss段)
- 堆:调用malloc,申请空间的操作
- 栈:局部变量
创建进程
- 使用fork()函数
- fork()函数调用成功,返回两次
- 返回0:子进程
- 返回非负数(子进程的id):父进程
- 返回-1:失败
- fork()函数调用成功,返回两次
int main()
{
pid_t pid;
pid = getpid();
printf("current pid =:%d\n",pid);
pid = fork();
if(pid<0)
{
printf("create failed\n");
}
else if(pid==0)
{
printf("children pid= %d\n",getpid());
}
else
{
printf("father, pid =%d\n",getpid());
}
return 0;
}
- question
- 以前的linux与现在的linux创建进程时的拷贝的区别
- 以前:是完完全全的拷贝,所有都拷贝下来
- 现在:不发生数据变化时,采用共享数据,发送数据变化时,子进程会单独的copy一份,不会影响父进程(写时拷贝)
- 以前的linux与现在的linux创建进程时的拷贝的区别
Vfork
- 区别
- vfork直接使用父进程存储空间,不拷贝
- vfork要保证先运行,当子进程调用exit函数退出后,父进程才执行
进程退出
- 正常退出
- main函数调用return
- 进程调用exit(), ----标准c库
- 进程调用_exit()或_Exit() —系统调用
- 进程最后一个线程返回
- 最后一个线程调用pthread_exit()
- 异常退出
- 调用abort
- 当进程收到某些信号时,如Ctrl+c
- 最后一个进程取消请求做出的响应
等待子进程退出
- 子进程退出状态不被收集,会变成僵尸进程
- 为啥要等待子进程
- 为了收集子进程的退出状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzfTiD49-1647508043158)(C:\Users\27670\AppData\Roaming\Typora\typora-user-images\image-20220227200431978.png)]
- 参数说明
- status:
- 非空:子进程退出状态放在它所指向的地址中
- 空:不关心退出状态
- status:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOYBYSeW-1647508043159)(C:\Users\27670\AppData\Roaming\Typora\typora-user-images\image-20220227200545812.png)]
int main()
{
pid_t pid;
int status=3;
int cnt =0;
pid = fork();
if(pid<0)
{
wait($status);
printf("children exit status=%d",WEXITSTATUS(status));
while(1)
{
printf("cnt=%d",cnt);
printf("this is father pid=%d\n",getpid());
sleep(1);
}
printf("create failed\n");
}
else if(pid==0)
{
while(1)
{
printf("children pid= %d\n",getpid());
cnt++;
sleep