进程创建、进程等待、进程终止、进程替换、模拟shell

本文详细介绍了进程管理的相关概念,包括fork创建进程、vfork的特性和使用、进程的正常与异常退出、进程等待的重要性以及wait与waitpid的区别。此外,还探讨了进程替换(exec函数)以及如何模拟shell操作。
摘要由CSDN通过智能技术生成

一:进程创建
fork创建进程
在https://mp.csdn.net/postedit/81710318博客中简单介绍了用fork创建进程,
用fork创建进程时,子进程复制的是父进程的PCB,包括子进程复制了父进程的虚拟地址空间和页表,所以子进程的数据和父进程的数据虚拟地址相同,由于页表映射,这时子进程和父进程物理内存也相同,但是当子进程的数据发生改变时,系统会为子进程的数据重新分配物理内存空间,这时两者的物理内存不同,也就意味着子进程数据的改变不会影响父进程数据(写时拷贝)。
这里写图片描述
在fork之前,父进程单独执行,fork之后,父子进程分流执行。
这里写图片描述
fork常规用法:
子进程复制父进程,由于fork返回值不同分流后,父子进程可以同时执行不同的代码段。如:父进程等待客户端请求,生成子进程来处理请求;
一个进程要执行一个不同的程序。如子进程从fork返回后,可以调用exec函数。
fork调用失败的原因:
系统有太多的进程,而且规定了用户可以启动的进程数,但实际用户的进程数超过了限制,就会造成fork调用失败。
vfork创建进程:
这里写图片描述
vfork用于创建一个子进程,子进程和父进程共享一个虚拟地址空间,而fork父子进程有独立的虚拟地址空间;
vfork保证子进程先执行,当子进程调用exit或exec之后父进程才可能被调度执行。

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6         int pid=-1;
  7         int val=100;
  8         pid=vfork();
  9        printf("-----%d\n",getpid());
 10         if(pid<0)
 11                 exit(0);
 12         else if(pid==0)
 13         {
 14                val=200;
 15                 printf("this id child!! %d\n",getpid());
 16              // exit(0);
 17         }
 18         else
 19         {
 20                 printf("this is parent!!%d %d\n",getpid(),val);
 21         }
 22         while(1)
 23         {
 24                 printf("this is public!! %d\n",getpid());
 25                 sleep(1);
 26         }
 27 }

这里写图片描述
当子进程exit退出后:父进程开始执行
这里写图片描述
子进程修改了父进程的值,因为子进程在父进程的地址空间运行。
vfork :创建一个子进程
子进程没有退出或者运行其他程序之前,父进程阻塞在vfork处不返回。
二:进程终止
正常退出:
从main函数return :

  1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5         int i=1;
  6         if(i>0)
  7                 return 1;
  8         else
  9                 return -1;
 10 }

这里写图片描述
可以用$?查看程序的退出码;只有在 main函数return才会退出进程,在main函数中return 跟调用exit效果一样

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值