操作系统:进程的创建(fork函数)、进程的替换(exec函数)、进程的阻塞(wait函数)、进程的终止(exit函数)、进程的挂起(sleep函数)

news2024/12/24 2:34:26

文章目录

    • 1.进程的创建
    • 2.进程的替换
    • 3.进程的阻塞
    • 4.进程终止
    • 5.进程的挂起

1.进程的创建

①调用fork函数的进程为父进程,调用后生成一个子进程;
②创建子进程成功时,父进程中fork函数的返回值是子进程的进程号PID;
③创建子进程失败时,父进程中fork函数的返回值是一个负数;
④子进程复制当前进程中所有变量的值,并复制fork函数调用后父进程剩下的所有代码。
⑤子进程中的进程号PID为0。
⑥需要引入头文件<unistd.h>

另外,可以用getpid函数获取当前进程的进程号PID

Current_Pid=getpid()

问题举例:

编写程序,使用系统调用fork()创建如下的进程树,当此程序运行时,在系统中有一个父进程和多个子进程活动,父进程等子进程运行结束后退出。
每个进程循环5次显示不同的字符串。假设X的初值为2022,父进程的字符串内容包括自己的学号、姓名、变量X的值;子进程字符串包括进程PID、子进程序号(子进程1或2)、变量X的值。每次循环X的值加5。记录屏幕上的显示结果,并分析变量X的变化规律。
在这里插入图片描述

求解代码:

#include<stdio.h>
#include<unistd.h>  //使用fork函数和getpid函数都需要导入这个头文件

int main(void)
{
	int pid1,pid2;  //分别用两个变量记录两个子进程的进程号
	int x=2022;    
	int temppid;   //记录某时刻的进程号
	
	pid1=fork();   //父进程用fork函数创建一个新的子进程

	if(pid1<0)     //如果子进程的进程号小于1则表示进程创建失败
	{
		printf("第一个子进程创建失败!\n");
	}
	else if(pid1==0)  //如果进程号为0表示当前进程就是第一个子进程,则执行下面的代码段
	{
		pid2=fork(); //创建一个新的子进程
		if(pid2<0)    //创建第二个子进程失败的情况
		{
			printf("第二个子进程创建失败!\n");
		}
		else if(pid2==0)  //第二个子进程执行的代码段
		{
			int k=0;
			for(k=0;k<5;++k)
			{
				temppid=getpid();
			    printf("PID=%d 串联创建的子进程2  X=%d\n",temppid,x);
                x+=5;
			}
		}
		else //第一个子进程执行的代码段
		{
			int j=0;
			for(j=0;j<5;++j)
			{
				temppid=getpid();
			    printf("PID=%d 串联创建的子进程1  X=%d\n",temppid,x);                                                                                                                                                                                                                                                                      
			    x+=5;
			}
		}
	}
	else  //父进程执行的代码段
	{
		int i=0;
		for(i=0;i<5;++i)
		{
			temppid=getpid();
		    printf("学号:123 姓名:小明 X=%d\n",x);
            x+=5;
		}
	}

	return 0;
}

运行效果:

在这里插入图片描述

2.进程的替换

①调用execlp函数可以进行进程替换;
②execlp函数的参数是需要执行的带有完整路径的程序名以及一个指针(注意是可执行文件而不是源代码C文件,指针一般取NULL);
③进程替换后该进程的数据区和代码区都变为替换到的程序的数据和代码。

问题举例:

修改上一题编写的程序,将子进程改为独立的程序,父进程创建子进程并进行程序替换,观察程序执行时屏幕出现的现象,并分析原因。

求解代码:

①父进程代码:

#include<stdio.h>
#include<unistd.h>

int main(void)
{
	int pid1,pid2;
	int x=2022;
	int temppid;
	
	pid1=fork();
	
	if(pid1<0)
	{
		printf("子进程1创建失败!\n");
	}
	else if(pid1==0)
	{
		pid2=fork();
		
		if(pid2<0)
		{
			printf("第二个子进程创建失败!\n");
		}
		else if(pid2==0)
		{
			execlp("./2.2.2",0);
		}
	    else
	    {
	        execlp("./2.2.1",0);
        }
	}
	else
	{
        wait(NULL);
		int i=0;
		for(i=0;i<5;++i)
		{
			temppid=getpid();
		    printf("学号:123 姓名:小明 X=%d\n",x);
            x+=5;
		}
	}
	
	return 0;
}

②子进程1代码(即父进程中调用的2.2.1):

#include<stdio.h>
#include<unistd.h>

int main(void)
{
	int x=2022;
	int i;
	int pid;
	
	for(i=0;i<5;++i)
	{
		pid=getpid();
		printf("PID=%d 子进程1  X=%d\n",pid,x);
        x+=5;
	}
	return 0;
}

③子进程2代码(即父进程中调用的2.2.2):

#include<stdio.h>
#include<unistd.h>

int main(void)
{
	int x=2022;
	int i;
	int pid;
	
	for(i=0;i<5;++i)
	{
		pid=getpid();
		printf("PID=%d 子进程2  X=%d\n",pid,x);
        x+=5;
	}
	return 0;
}

运行效果:

在这里插入图片描述

3.进程的阻塞

①调用wait函数可以实现进程的阻塞;
②调用wait函数的进程必须等到其所有子进程结束后才能继续执行;
③wait函数的参数为一个指针,一般传入NULL。

4.进程终止

①调用exit函数可以实现进程的终止;
②终止当前进程的同时不会终止该进程的所有子孙进程。孤儿进程会被init进程收养。
③使用exit函数需要引入函数库<stdlib.h>

孤儿进程示例代码

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(void)
{
	int pid;

	pid=fork();
	
	if(pid<0)
	{
		printf("子进程创建失败!\n");
	}
	else if(pid==0)
	{
		int i;
		for(i=0;i<10;++i)
		{
			sleep(2);
			printf("父进程的PID=%d\n",getppid());
		}
	}
	else
	{
		sleep(3);
		printf("父进程输出自己的PID=%d\n",getpid());
                                  exit(0);
	}

	return 0;
}

运行效果:

在这里插入图片描述

5.进程的挂起

①使用sleep函数挂起一个进程;
②sleep函数的参数是需要休眠的时间,以秒计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Java代码如何项目部署

在研究注解的时候会用到反射&#xff0c;在学习反射的时候会涉及到关于class文件的生成&#xff0c;以及Class文件是如何被执行的等一系列关于文件转换的问题&#xff0c;接下来就借助学习反射来学习一下项目整体部署的过程和每个阶段要生成的文件. 我们写的代码写完并测试之后…

粒子群算法求解电力系统环境经济调度+微电网调度(风、光、电动车、柴油机、主网)(Python代码实现)

目录 1 电力系统环境经济调度数学模型 2 改进粒子群算法解决 2.1 知识回顾 2.2 案例1——IEEE6节点 2.3 案例2——IEEE10 2.4 案例3——IEEE40 3 Python代码 1 电力系统环境经济调度数学模型 2 改进粒子群算法解决 2.1 知识回顾 先回顾一下相关知识点&#xff1a; *智…

打开网站出现Internal Server Error的原因和解决方法

打开网站出现Internal server error 500错误&#xff0c;通常是服务端出现一些未知异常&#xff0c;但是在检查的时候我们不能仅仅只是关注应用服务&#xff0c;而是要关注从服务端接收请求开始&#xff0c;一直到应用服务的整条链路。 程序文件中的权限问题导致Internal Serv…

正确的PMP®答题思路——让你考试更轻松

想要考取PMP的小伙伴们&#xff0c;大家现在复习的如何呢&#xff1f;是不是还在不断刷题呢&#xff1f;做题不单单需要充足的知识储备&#xff0c;更需要正确的答题思路&#xff0c;今天小编给大家整理了PMP考试答题的一些思路&#xff0c;想要考取PMP的小伙伴们快来看看吧&am…

Wireshark过滤器语法

1.官网地址 点击进入 2.捕获过滤器 使用捕获过滤器Wireshark只捕获满足过滤器条件的数据包进来。捕获过滤器采用BPF语法表达式&#xff0c;表达式由如下及部分组成: Dir 指明传输方向是前往还是来自 例如&#xff1a;src、dst Type 指出名字或数字所代表的意&#xff0c;例如…

SpringCloud微服务(七)——Bus服务消息总线

SpringCloud Bus动态刷新全局广播 SpringCloud Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新&#xff0c;通知一处&#xff0c;处处生效。而不用一个一个去通知。 Spring Cloud Bus是消息总线&#xff0c;广播通知都可以集成&#xff0c;不止用于实现…

java项目测试成功后部署到服务器上的相关问题

1.java项目是如何部署给用户使用的? 前提&#xff1a; 以一个web项目为例&#xff0c; 使用工具&#xff1a;开发工具&#xff1a;IDEA&#xff1b;Tomcat&#xff08;应用服务器&#xff09;&#xff1b;Navicat&#xff08;数据库&#xff09;&#xff1b;Jenkins&#xff…

CDMP考试需不需要参加培训课程?培训机构哪家比较好?

参加CDMP认证考试到底要不要参加培训课程&#xff0c;身边的很多同学都参加了培训班&#xff0c;我要参加吗&#xff1f;总是会有很这样的人提出这样的问题。 那么&#xff0c;我想说考试的结果不在于你定什么样的目标&#xff0c;如何做计划&#xff0c;而在于你何时开始行动…

Flutter高仿微信-第26篇-新的朋友

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.c…

智慧餐厅解决方案-最新全套文件

智慧餐厅解决方案-最新全套文件一、建设背景二、建设思路1、刺激消费手段单一2、用户信息反馈量少3、商家推广覆盖面小4、生产力利用率偏低三、建设方案1 、组织人事在线管理&#xff0c;盘活内部人力资源2、多样化考勤方式&#xff0c;轻松实现多地工时管理3、数据成本分析&am…

大数据(9f)Flink状态编程

文章目录概述Managed StateOperator StateListStateBroadcastStateKeyed StateValueStateListStateMapStateReducingStateAggregatingState状态后端Appendix概述 流式计算 分为 无状态计算 和 有状态计算 流处理的状态功能&#xff1a;去重、监控…… 状态分类Managed StateR…

半诚实模型与恶意模型

原创 洪澄 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 178篇…

【Unity】自定义Untiy天空

3、需求&#xff1a;更改默认天空盒&#xff0c;360显示所需的内容。 实施&#xff1a; 准备材料&#xff1a;一张8K图&#xff08;更清晰&#xff09; 步骤&#xff1a; 1、更改Camera为天空盒&#xff1b; 2、制作图片&#xff0c;怎么制作不说了&#xff0c;分辨率8192…

Linux服务器安装部署最新稳定版本mongoDB社区版- Ubuntu-20.04版本

没有玩过mongoDB&#xff0c;安装一次真&#x1f92c;波折&#xff0c;再次建议大家安装之前&#xff0c;一定要确定好服务器的操作系统&#xff0c;可以参考查看linux操作系统版本&#xff1a;Ubuntu&#xff1f;Centos&#xff1f;还是其他&#xff1f; 接前面在本地自测需要…

解决jupyter下载好了库,但是无法使用的问题。以及补充jupyter如何下载新的库。

文章目录出现原因验证解决步骤补充国内常用镜像源出现原因 出现这个问题的主要原因是&#xff0c;jupyter的内核&#xff08;或者说他使用的Python环境&#xff09;与下载库的环境不一样&#xff0c;解决办法就是更改kernel。换句话说就是将jupyter下载库的环境加入到内核环境…

模拟双色球系统——Java

目录 一、内容简介 二、 基本流程 三、具体步骤 1.菜单栏 2.随机生成幸运号码 3.用户输入 4.判断中奖情况 5.打印数组 四、代码实现 五、效果展示 一、内容简介 双色球是彩票的一种玩法&#xff0c;规则如下&#xff1a; 红球一共6组&#xff0c;每组从1——33中随…

微信h5 使用jssdk支付成功后,点击完成 页面关闭了,引出微信“点金计划“

可能会迷惑 为啥我们之前没有碰见过这种情况! 这样的情况只有两种情况,就是 你只是普通商户不是微信特约商户你的支付跳转功能还未被微信回收 那么怎么才能支付成功重新跳回自己的网站页面 刚开始经历这种情况的童鞋, 可能有点懵逼 先看个微信的之前发的一个公告吧 微信支付公…

面试系列分布式事务:谈谈3PC的理解

3PC就是三阶段提交是在二阶段提交上的改进版本&#xff0c;3PC最关键要解决的就是协调者和参与者同时挂掉的问题&#xff0c;所以3PC把2PC的准备阶段再次一分为二&#xff0c;这样三阶段提交。处理流程如下 &#xff1a; 阶段一 a) 协调者向所有参与者发出包含事务内容的 canCo…

【深入浅出Java并发编程指南】「实战篇」教你如何使用AbstractQueuedSynchronizer实现自己的同步器组件

前提概要 之前的文章中会涉及到了相关AQS的原理和相关源码的分析&#xff0c;所谓实践是检验真理的唯一标准&#xff01;接下来就让我们活化一下AQS技术&#xff0c;主要针对于自己动手实现一个AQS同步器。 定义MyLock实现Lock Doug Lea大神在JDK1.5编写了一个Lock接口&#xf…

【C++】模拟实现STL容器:vector

目录 一、vector迭代器失效问题 1、Visual Studio和g对迭代器失效问题的表现 2、解决迭代器失效的方法 二、模拟实现构造函数调用不明确 1、问题描述 2、解决调用不明确的方法 三、reserve中的深浅拷贝问题 1、reserve中浅拷贝发生原因 2、浅拷贝发生的图解 3、解决方…