当前位置: 首页 > news >正文

Linux高并发服务器开发 第十五天(fork函数)

目录

1.fork 函数

1.1创建子进程

1.2getpid 函数

1.3getppid 函数

 1.4getgid函数

1.5循环创建 n 个子进程

1.6fork后父子进程异同

1.6.1读时共享,写时复制

1.6.2fork后父子进程共享

1.6.3gdb调试父子进程


1.fork 函数

pid_t fork(void);

成功:// fork之后,会产生一个子进程。 父、子进程各自对fork函数做返回。
    父进程:返回 子进程id
    子进程:返回 0
失败: // 不产生子进程。
    -1 errno

注意: pid_t是一个short类型的变量,实际表示的是内核中的进程表的索引

- fork 之后,父、子进程,共同争夺cpu ,执行先后顺序随机,如下

1.1创建子进程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>void sys_err(const char *str)
{perror(str);exit(1);
}int main(int argc, char *argv[])
{printf("=============before fork=============\n");pid_t pid = fork();if (pid == -1)sys_err("fork error");if (pid == 0) {   // 子进程printf("Iam child, 我的id = %d\n", getpid());} else if (pid > 0)  {  // 父进程printf("I am parent, 我儿子的id = %d, 我的id= %d\n", pid, getpid());}printf("=============after fork=============\n");return 0;
}

1.2getpid 函数

pid_t getpid(void);   

获取当前进程ID

1.3getppid 函数

pid_t getppid(void);   

获取当前进程的父进程ID
- **ps aux | grep 关键字**。  —— 搜索系统中包含关键字的进程。

- ./a.out 进程的父进程 bash
- 系统调用函数、库函数区别:
    - 1. 访问内核数据结构。  2. 访问硬件资源。
    - 系统调用:  以上两者二占其一。
    - 库函数:以上两者均不占。

 1.4getgid函数

pid_t getgid(void);   pid_t getegid(void);   

 //获取当前进程使用用户组ID

//获取当前进程有效用户组ID

1.5循环创建 n 个子进程

- 为了避免 子进程也fork产生 “孙进程”。 需要每次fork 后,将子进程 结束运行,不参与下一次fork。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>void sys_err(const char *str)
{perror(str);exit(1);
}int main(int argc, char *argv[])
{int i = 0;for (i = 0; i < 5; i++) {if (fork() == 0)break;        // 循环期间,子进程不参与循环.}if (5 == i) {        // 循环从 表达式 2 结束. --- 父进程sleep(5);printf("I'm parent \n");} else {sleep(i);printf("I'm %dth child\n", i+1);}return 0;
}

1.6fork后父子进程异同

“刚刚” fork 后:

父子相同:

- 全局变量、.data、.text、栈、堆、环境变量、用户ID、进程工作目录、宿主目录、信号处理方式...

父子不同:

- 进程ID、fork返回值、进程运行时间、父进程ID、闹钟(定时器)、未决信号集。

1.6.1读时共享,写时复制

- fork后,对于父进程的用户空间的数据,系统采用 读时共享,写时复制 原则。
- 重点常用:全局变量。

1.6.2fork后父子进程共享

1. 文件描述符(对应 打开的文件结构体)
2. mmap 创建的映射区。

1.6.3gdb调试父子进程

- 在 fork 函数调用之前:
- 跟踪父进程执行逻辑:set follow-fork-mode parent(默认)
- 跟踪子进程执行逻辑:set follow-fork-mode child  

相关文章:

Linux高并发服务器开发 第十五天(fork函数)

目录 1.fork 函数 1.1创建子进程 1.2getpid 函数 1.3getppid 函数 1.4getgid函数 1.5循环创建 n 个子进程 1.6fork后父子进程异同 1.6.1读时共享&#xff0c;写时复制 1.6.2fork后父子进程共享 1.6.3gdb调试父子进程 1.fork 函数 pid_t fork(void); 成功&#xff1a;…...

【人工智能】Python中的自动化机器学习(AutoML):如何使用TPOT优化模型选择

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 随着机器学习在各行业的广泛应用&#xff0c;模型选择和优化成为了数据科学家面临的主要挑战之一。自动化机器学习&am…...

探秘自然地理:从太阳到地球的奇妙之旅与灾害预警

在浩瀚无垠的宇宙中&#xff0c;我们的地球与太阳紧密相连&#xff0c;它们的奥秘和变化&#xff0c;时刻影响着我们的生活。今天&#xff0c;就让我们一同深入探索自然地理的基础知识&#xff0c;揭开太阳与地球的神秘面纱&#xff0c;同时了解那些可能给我们带来巨大影响的自…...

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能&#xff0c;可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包&#xff0c;可以用来在 Go 程序中模拟浏览器操作&#xff0c;如页面截图、DOM 操作、表单提交等。 下面是一个…...

AI发展困境:技术路径与实践约束的博弈

标题&#xff1a;AI发展困境&#xff1a;技术路径与实践约束的博弈 文章信息摘要&#xff1a; AI技术发展路径主要受实践约束驱动&#xff0c;而非纯理论优势。大型AI实验室的成功更依赖优质执行力和资源优势&#xff0c;而非独特技术创新。当前AI发展面临评估体系与实际应用脱…...

[前端算法]排序算法

在js中一般用到sort方法 arr.sort((a,b)>{return a-b })基础排序 冒泡排序 function bubbleSort(arr) {let len arr.length;for (let i 0; i < len; i) {for(let j0;j<len-i-1;j){if(arr[j]>arr[j1]){[arr[j],arr[j1]] [arr[j1],arr[j]]}}}console.log(arr);…...

Zemax STAR 模块的入门设置

Zemax OpticStudio 中的 STAR 模块允许直接导入来自有限元分析 &#xff08;FEA&#xff09; 软件的变形数据&#xff0c;从而将光学设计与热和结构分析联系起来。这种集成可以分析实际环境因素&#xff08;如热和机械应力&#xff09;对光学性能的影响。该模块有助于了解光学系…...

知识图谱的语义叙事:构建智慧的连贯之路

目录 前言1. 什么是知识图谱的语义叙事1.1 语义清晰性1.2 叙事连贯性1.3 背景关联性 2. 知识图谱语义叙事的核心功能2.1 增强信息的可理解性2.2 提供上下文支持2.3 支持推理与发现2.4 提升知识可视化效果 3. 语义叙事的关键实现技术3.1 自然语言处理&#xff08;NLP&#xff09…...

Oracle graph 图数据库体验-安装篇

服务端安装 环境准备 安装数据库 DOCKER 安装23AI FREE &#xff0c;参考&#xff1a; https://container-registry.oracle.com/ords/f?p113:4:111381387896144:::4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:1…...

Nginx:从入门到实战使用教程

全方位解析Nginx&#xff1a;从入门到实战使用教程 Nginx安装、配置详细教程 文章目录 全方位解析Nginx&#xff1a;从入门到实战使用教程导语一、Nginx简介二、Nginx安装与配置 1. 在CentOS系统上安装Nginx&#xff1a;2. 在Ubuntu系统上安装Nginx&#xff1a;3. Nginx配置文…...

网络安全:信息时代的守护者

随着互联网的快速发展&#xff0c;网络安全问题日益成为全球关注的焦点。无论是个人用户、企业组织还是政府部门&#xff0c;网络安全都已成为保障信息安全、保护隐私、确保社会秩序的基石。在这个数字化时代&#xff0c;如何应对复杂多变的网络安全威胁&#xff0c;成为了我们…...

Visual Studio Code + Stm32 (IAR)

记录一下&#xff0c; 以前看别人在 vsc 下配置 stm32 工程非常麻烦。 最近&#xff0c;突然发现&#xff0c; iar 官方出了两个插件&#xff0c; iar build 、 iar C-Spy 安装之后&#xff0c;配置一下 iar 软件路径。 然后&#xff0c;直接打开工程目录&#xff0c;编译…...

JavaScript语言的正则表达式

JavaScript语言的正则表达式详解 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex或RegExp&#xff09;是一种强大的文本处理工具&#xff0c;可以在字符串中执行模式匹配和替换操作。在JavaScript中&#xff0c;正则表达式是处理字符串时不可或缺的部分&…...

R语言的编程范式

R语言的编程范式探讨 引言 R语言作为一种专门用于统计分析和数据可视化的编程语言&#xff0c;近年来得到了广泛的应用。无论是在学术研究、企业分析&#xff0c;还是在数据科学的各个领域&#xff0c;R语言凭借其强大的数据处理能力和丰富的图形化工具&#xff0c;吸引了大批…...

CentOS9 安装Docker+Dpanel+onlyoffice(https、更改字体、字号、去除限制)的避坑笔记

CentOS9 安装Dockeronlyoffice&#xff08;https、更改字体、字号、去除限制&#xff09;的避坑笔记 一、安装Docker二、更新docker镜像源&#xff1a;三、安装Dpanel四、安装onlyoffice五、更改字体和字号六、去除限制 动手前&#xff0c;预防遭遇各种莫名奇妙的问题&#xff…...

Excel 技巧11 - 如何使用Excel作成简单的排班表(★★),weekday 函数,TEXT函数

本文讲了如何在Excel中制作简单的排班表。 1&#xff0c;排班表Layout效果 - B2 单元格找那个输入 日期 - C3 - AG3 输入日&#xff0c;就是该月份的几号&#xff0c;比如1月5号&#xff0c;就输入5 如果是周六周日&#xff0c;背景色显示为绿色 - B4 ~ 输入员工名称 当 B2…...

StarRocks 怎么让特定的SQL路由到FE master节点的

背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的&#xff0c;而只有master节点才能对元数据进行写操作。但是为什么呢&#xff1f;哪里有体现呢&#xff1f; 这其中的原因在网上是搜不到的&#xff0c;所以大家只知道只有master节点才…...

在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息

打印崩溃调用栈和局部变量信息的方法有所不同。以下是针对 Windows、Linux 和 MacOS 的示例代码。 Windows 在 Windows 上&#xff0c;可以使用 Windows API 来捕获异常并打印调用栈。 #include <windows.h> #include <DbgHelp.h> #include <stdio.h> #in…...

解决npm install安装出现packages are looking for funding run `npm fund` for details问题

当我们运行npm install时&#xff0c;可能会收到类似以下的提示信息&#xff1a;“x packages are looking for funding.” 这并不是错误提示&#xff0c;也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…...

豆包MarsCode:小C点菜问题

问题描述 思路分析 这道题的核心任务是找出所有不超过给定价格 m 的菜肴中&#xff0c;最常见的菜肴价格&#xff0c;最后返回该价格的出现次数。 1. 题意理解&#xff1a; 给定一个最大价格 m&#xff0c;小C只会选择价格不超过 m 的菜。菜单上有 n 道菜&#xff0c;每道菜…...

Nginx 访问根目录自动跳转到指定目录配置

包含 ** 永久跳转&#xff08;301&#xff09;和内部重写&#xff08;地址栏不变&#xff09;** 两种方案方案 1&#xff1a;301 永久跳转&#xff08;推荐&#xff0c;SEO 友好&#xff09;访问 http://域名/ → 自动跳转到 http://域名/指定目录/server {listen 80;# 你的域名…...

企业级文档翻译离线部署终极指南:BabelDOC本地化实战深度解析

企业级文档翻译离线部署终极指南&#xff1a;BabelDOC本地化实战深度解析 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 在当今全球化业务环境中&#xff0c;企业面临着海量技术文档、研究报告…...

LangChain重构多Skill Agent系统:智能工具集成实战

LangChain*重构的完整多Skill Agent系统 目录 LangChain*重构的完整多Skill Agent系统 一、LangChain 版本优势 二、完整可运行代码 三、各部分作用解释 1. 工具定义(`@tool` 装饰器) 2. 提示词模板(`ChatPromptTemplate`) 3. Agent 创建与执行器 4. 工具内部调用 LLM(`s…...

工业以太网无线网桥 SG-WX-Bridge v2.0|免布线、一对多、即插即用,工业现场无线通信神器

工厂布线麻烦、距离远、施工成本高&#xff1f;设备移动频繁、有线网扯来扯去易损坏&#xff1f;三格电子SG-WX-Bridge v2.0 工业以太网无线网桥&#xff0c;专为工业现场打造&#xff0c;把有线网变无线&#xff0c;1 台 AP 最多带 8 台 STA&#xff0c;Profinet/EtherNet/IP/…...

如何扩展LivePython功能:开发者定制指南与API详解

如何扩展LivePython功能&#xff1a;开发者定制指南与API详解 【免费下载链接】livepython Visually trace Python code in real-time. 项目地址: https://gitcode.com/gh_mirrors/li/livepython LivePython是一款创新的Python代码实时可视化追踪工具&#xff0c;让开发…...

电子电路中的“心脏”:电源忧

前言 Kubernetes 本身并不复杂&#xff0c;是我们把它搞复杂的。无论是刻意为之还是那种虽然出于好意却将优雅的原语堆砌成 鲁布戈德堡机械 的狂热。平台最初提供的 ReplicaSets、Services、ConfigMaps&#xff0c;这些基础组件简单直接&#xff0c;甚至显得有些枯燥。但后来我…...

2026螺杆空压机性价比品牌榜:7.5-500KW选型指南

在工业制造领域&#xff0c;压缩空气被誉为“第四大能源”&#xff0c;而螺杆空压机作为其核心动力源&#xff0c;其选型直接关系到企业的生产成本、运行效率和长期发展。面对市场上琳琅满目的品牌和型号&#xff0c;如何从7.5KW到500KW的广阔功率区间内&#xff0c;挑选出兼具…...

PowerMeter:嵌入式电能计量开源库设计与实现

1. 项目概述PowerMeter 是一款面向嵌入式电能计量场景的轻量级开源库&#xff0c;专为基于 ZMPT101B 电压传感器与 ZMCT103C 电流传感器构建的单相交流电参数测量系统而设计。该库不依赖特定硬件平台&#xff08;如 Arduino、ESP32 或 STM32&#xff09;&#xff0c;其核心抽象…...

详细解析Spring如何解决循环依赖问题事

AI训练存储选型的演进路线 第一阶段&#xff1a;单机直连时代 早期的深度学习数据集较小&#xff0c;模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低&#xff0c;吞吐量极高&#xff0c;也就是“数据离…...

【2026年阿里巴巴集团暑期实习- 4月8日-工程岗-第一题- 可删去的字符串】(题目+思路+JavaC++Python解析+在线测试)

题目内容 给你 $ n $ 个字符串。我们称某个字符串 $ s_i $ 是“可删去的”,当且仅当存在两个下标 $ j, k (j \neq k) $,满足 $ s_j + s_k = s_i $。换句话说,我们称某个字符串是“可删去的”,当且仅当它能由两个来自原字符串序列中不同位置的非空字符串拼接而成。 你的任…...