首页 > 系统相关 >进程中的if和else

进程中的if和else

时间:2023-12-26 18:34:01浏览次数:28  
标签:p2 fork p1 返回 else 进程

进程互斥实验的时候遇到了一段代码没有看懂

#include <stdio.h>
#include <unistd.h>
int main( )
{
     int p1,p2,i;
     while((p1=fork( ))= = -1);       /*创建子进程p1*/
     if (p1= =0)
     {
          lockf(1,1,0);          /*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/
          for(i=0;i<10;i++)
               printf("daughter %d\n",i);
     lockf(1,0,0);                     /*解锁*/
     }
     else
     {
          while((p2=fork( ))= =-1);  /*创建子进程p2*/
          if (p2= =0)
          {
               lockf(1,1,0);        /*加锁*/
               for(i=0;i<10;i++)
                    printf("son %d\n",i);
          lockf(1,0,0);            /*解锁*/
          }
          else
          {
               lockf(1,1,0);         /*加锁*/
               for(i=0;i<10;i++)
               printf(" parent %d\n",i);
               lockf(1,0,0);         /*解锁*/
          }
     }
}

这段代码执行的结果为(并不唯一)

daughter 0
daughter 1
...
daughter 9
...
parent 9

Q:为什么代码执行了if还能执行else?if else不应该是选择分支,只会执行一条吗?

1.首先懂得是如何子进程是如何创建的

使用fork() 函数进行进程的创建,会返回两个值,一个是向父进程返回子进程的PID,一个是向子进程返回0,子进程与父进程并发执行。

fork() 的返回值如下:
- 0:在子进程中,返回的是0,表示当前进程是子进程。
- \>0:在父进程中,返回的是子进程的id值
- -1:表示创建失败

fork执行后,子进程会得到:
- 进程表项和进程表示符
- 子进程继承父进程的所有文件
- 由核心创建的进程上下文
- 子进程执行(子进程的程序计数器是自己的,与父进程不同)

在代码中,首先父进程创建了一个子进程p1,然后给父进程的p1返回的是p1的pid,给子进程p1返回的p1是0,所以代码中的if语句在子进程中执行,而else语句在父进程中执行,else中的语句也如此,父进程继续创建子进程p2,fork给子进程p2返回0,给父进程返回子进程的pid,此时三个进程同时运行。

父进程继续执行else语句,而进程p1执行if语句,输出daught 0-9,进程p2也执行if 输出 son 0-9 ,父进程输出parent 0-9,由于使用了加锁,所以会对输出设备进行加锁,当一个进程在使用的时候,其他进程无法使用输出设备。

但是为什么输出顺序会改变?是由于操作系统的调度策略和进程的竞争情况决定的,看似p1要先于p2创建,但并不能表示p1的执行要优先与p2或父进程。

。。。个人理解。。

标签:p2,fork,p1,返回,else,进程
From: https://www.cnblogs.com/Crayon-Blog/p/17929017.html

相关文章

  • 内存、典型锁、相对地址、内存覆盖、守护进程、孤儿进程、僵尸进程、局部性原理
    内存与其作用:内存是用于存放数据的硬件,程序执行前需要 先放到内存 才可以被CPU处理典型的几种锁:读写锁:......
  • 虚拟技术-时分复用、空分复用、进程状态切换、程序生成过程、进程同步、虚拟内存
    虚拟技术把一个物理实体转换为多个逻辑实体。主要有两种虚拟技术:时(时间)分复用技术   空(空间)分复用技术多进程与多线程:多个进程能在同一个处理器上并发执行使用了 时分复用技术,每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。虚拟内存使用了空分复用......
  • Linux使用PM2守护进程
    PM2:Node.js应用的进程管理工具Node.js是一个强大的服务器端JavaScript运行时,而在实际部署和管理Node.js应用时,需要一种有效的进程管理工具。PM2(ProcessManager2)正是为此而生,它提供了一套全面的功能,使得在生产环境中轻松管理Node.js进程成为可能。安装PM2首先,确保......
  • Map+函数式接口去掉if-else
    判断条件放在key中对应的业务逻辑放在value中这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑代码:importcom.wing.service.QueryGrantTypeService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.P......
  • Map+函数式接口去掉if-else
    判断条件放在key中对应的业务逻辑放在value中这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑代码:importcom.wing.service.QueryGrantTypeService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.P......
  • 在linux中查看运行指定进程资源占用(cpu+gpu)
    在运行程序时有时候会需要查看资源占用,以方便部署在其他服务器上时进行参考。以下是总结了我在linux上查找程序进程资源的两种方法(cpu和gpu都有)。CPU1.查找进程号如果进程较多,输入ps-ef|grep+指令关键词进行搜索。如果运行的是python程序,可以输入ps-ef|greppytho......
  • 进程调度算法--引阿秀学习笔记
    1.先来先服务First-comeFirst-serverd(FCFS)按照请求顺序进行调度,利于长作业,不利短作业,短作业等待前面长作业执行完毕才可执行,造成短作业等待时间长。2.短作业优先shortestjobfirst(SJF)按估计运行时间最短的作业顺序进行调度,长作业可能会饿死(假如一直有短作业到来)3.......
  • C 语言教程:条件和 if...else 语句
    C语言中的条件和if...else语句您已经学习过C语言支持数学中的常见逻辑条件:小于:a<b小于或等于:a<=b大于:a>b大于或等于:a>=b等于:a==b不等于:a!=b您可以使用这些条件来根据不同的决策执行不同的操作。C语言具有以下条件语句:使用if来指定要执行的代码块,......
  • C 语言教程:条件和 if...else 语句
    C语言中的条件和if...else语句您已经学习过C语言支持数学中的常见逻辑条件:小于:a<b小于或等于:a<=b大于:a>b大于或等于:a>=b等于:a==b不等于:a!=b您可以使用这些条件来根据不同的决策执行不同的操作。C语言具有以下条件语句:使用if来指定要执行的代码块......
  • 接手了个项目,被if..else搞懵逼了
    接手了个项目,被if..else搞懵逼了 背景领导:“这个项目,今后就给你维护了啊,仔细点。”小猫:“好,没问题”。可当满怀信心的小猫打开项目工程包翻看一些代码之后,瞬间懵逼没了信心。是这样的还是这样的平级的ifelse密密麻麻就算了,但是深套五六层的ifelse甚至七八层的真的是让人摸......