(3.8)进程与线程——创建进程

2024-06-08 07:18
文章标签 线程 创建 进程 3.8

本文主要是介绍(3.8)进程与线程——创建进程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.创建进程
      • (1)Linux中创建进程的方式
      • (3)0号进程和1号进程(init进程)
      • (2)创建子进程
      • (3)fork函数的工作流程
      • (4)fork函数执行后,父子进程的主要异同点
    • 2.父子进程共享文件
    • 3.fork的用法
    • 4.vfork函数

1.创建进程

(1)Linux中创建进程的方式

  • 在shell中执行命令或可执行文件
    由shell进程调用fork函数创建子进程,并执行输入的命令或可执行文件本身
  • 在代码中(已经存在的进程中)调用fork函数创建子进程
    通过fork函数创建的进程为已经存在进程的子进程,即:已经存在的进程本身是父进程

(3)0号进程和1号进程(init进程)

  • Linux系统中进程0( PID=0)是由内核创建,其他所有进程都是由父进程调用fork函数所创建的
  • Linux系统中进程0在创建子进程( PID=1, init进程)后,进程0就转为交换进程或空闲idle进程
  • 进程1( init进程)是系统中其他所有进程的共同祖先
    在这里插入图片描述

(2)创建子进程

  • 函数原型
头文件: unistd.h
pid_t fork(void);返回值
fork函数被正确调用后,将会在子进程中和父进程中分别返回!!
在子进程中返回值为0(不合法的PID,提示当前运行在子进程中)
在父进程中返回值为子进程ID(让父进程掌握所创建子进程的ID号)
出错返回-1
  • 创建子进程eg
int main(int argc, char **argv)
{pid_t pid;pid=fork();if (pid==-1)printf("fork error \n");else if (pid ==0){printf("the returned value is %d\n",pid);printf("in child process!\n");printf("My PID is %d\n", getpid());}else{printf("the returned value is %d\n", pid);printf("in father process!!\n");printf("My PID is %d\n",getpid());}return 0;
}

在这里插入图片描述

(3)fork函数的工作流程

  • 创建子进程的操作,实际上就是为子进程分配内核空间资源和用户空间资源的过程

  • 子进程是父进程的副本
    子进程复制/拷贝父进程的PCB、数据空间(数据段、堆和栈)
    父子进程共享正文段(代码段,只读),即:父子进程所执行的代码相同,并且在fork成功返回之后,分别共享相同的代码指针,子进程和父进程继续执行fork函数调用之后的代码,后面else语句啥的…

  • 为了提高效率, fork后不并立即复制父进程数据段、堆和栈,采用了写时复制机制(Copy-On-Write)COW
    当父子进程任意之一要修改数据段、堆、栈时,进行复制操作,并且仅复制修改区域

(4)fork函数执行后,父子进程的主要异同点

在这里插入图片描述

2.父子进程共享文件

(1)父子进程共享打开的文件
在这里插入图片描述

(2)父子进程对共享文件的常见处理方式

  • 父进程等待子进程完成。当子进程终止后,文件当前位置已经得到了相应的更新,父进程才进行文件的操作
  • 父子进程各自执行不同的程序段,各自关闭不需要的文件

3.fork的用法

(1)父进程希望复制自己(共享代码,复制数据空间),但父子进程执行相同代码中的不同分支

  • eg:网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork创建子进程处理该请求,而父进程继续等待下一个服务请求到达

(2)父子进程执行不同的可执行文件(父子进程具有完全不同的代码段和数据空间)

  • eg:子进程从fork返回后,立即调用exec类函数执行另外一个可执行文件

4.vfork函数

  • vfork用于创建新进程,而该新进程的目的是执行另外一个可执行文件,不会与父进程产生任何关联
  • 由于新程序将有自己的地址空间,因此vfork函数并不将父进程的地址空间完全复制到子进程中
  • 子进程在调用exec或exit之前,在父程的地址空间中运行
  • vfork函数保证子进程先执行,在它调用exec或者exit之后,父进程才会继续被调度执行(父进程处于TASK_UNINTERRUPTIBLE状态 (不可响应异步信号的状态),阻塞状态)

这篇关于(3.8)进程与线程——创建进程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041509

相关文章

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Java 如何创建和使用ExecutorService

《Java如何创建和使用ExecutorService》ExecutorService是Java中用来管理和执行多线程任务的一种高级工具,可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处... 目录一、什么是ExecutorService?二、ExecutorService的核心功能三、如何创建

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地