LinuxC++(11):创建一个进程

news2024/9/30 19:37:57

Linux的0、1和2号进程

整个linux系统全部的进程是一个树形结构。

0号进程(系统进程)是所有进程的祖先,它创建了1号和2号进程。

(相当于是我们世界的时间线)

1号进程(systemd)负责执行内核的初始化工作和进行系统配置。

2号进程(kthreadd)负责所有内核线程的调度和管理。

如何创建一个子进程

pid_t fork(void);

使用fork函数,使用fork函数创建的进程称为子进程,子进程和父进程共同执行fork函数及fork函数之后的代码。

可以实现父子进程运行不同的代码吗?

可以,因为fork函数虽然被调用一次,但是却返回两次值,一次是子类的,默认是0,一次是父类进程,默认是子类的进程号。

        执行逻辑是,如果返回了值,就先执行后面的代码,执行完后,再接收第二个返回值,再次执行后面的代码。

        依据这个逻辑,可以利用if -else实现两种代码功能,如果fork返回值为0就是子类时,执行一种情况,如果是非0时就是父类,执行另一种情况。

#include <iostream>
#include <unistd.h>
using namespace std;

int main()
{
  int bh=8;
  string message="轻舟已过万重山。";

  pid_t pid=fork();

  if (pid>0)
  { // 父进程将执行这段代码。
    sleep(1);
    cout << "父:pid=" << pid << endl;
    cout << "父:我是父亲" << bh << "号:" << message << endl;
  }
  else
  { // 子进程将执行这段代码。
    bh=3; message="两岸猿声啼不住。";
    cout << "子:pid=" << pid << endl;
    cout << "子:我是儿子" << bh << "号:" << message << endl;

因为父进程比子进程慢了1s,所以是先返回子类,然后再返回父类。

父进程和子进程的进程号相同吗?

不同,通过es - pf|grep demo可以知道。

其中,上面是父进程,下面是子进程, 第3列是父进程编号,可知子进程的父进程31895和上面相同。但归根还是不同的进程。

子进程和父进程是共享变量吗?

是共享变量,但是子进程如果将变量进行了修改,那么就不是共享变量了,此时父进程并没有受到子进程改变变量影响。因为共享的变量只是虚拟地址相同,但是物理地址不同。

僵尸进程

父进程先关闭子进程后关闭

        如果父进程比子进程先退出,子进程将被1号进程托管(这也是一种让程序在后台运行的方法)。在父进程后面加一个return 0,子进程while循环,父进程关闭后,子进程被1号进程托管。

子进程先关闭父进程后关闭

        如果子进程比父进程先退出,而父进程没有处理子进程退出的信息,那么,子进程将成为僵尸进程。

由图可知,如果父进程先走了,那么子进程就会成孤儿,查看进程就会发现<defunct>,不可用。

使用top查看当前性能也可知道有一个僵尸进程

僵尸进程的危害

因为CPU会为每一个进程都分配数据结构,如果存在僵尸进程,那么就会导致资源不会被释放。

更重要的是,僵尸进程占用了进程号,如果在系统繁忙的时候,有可能会因为没有足够的进程号而不会创建新的进程。

如何避免僵尸进程

pid_t wait(int *stat_loc); 

使用等待函数,就是等待子进程运行完毕。 

Linux使用信号

对于单进程,使用信号很简单,给程序发送信号,让服务程序退出。

如何杀死多进程?

        在多进程的服务程序中,如果子进程收到退出信号,子进程自行退出,如果父进程收到退出信号,则应该先向全部的子进程发送退出信号,然后自己再退出。

测试代码:

#include <iostream>
#include <unistd.h>
#include <signal.h>
using  namespace std;

void FathEXIT(int sig);  // 父进程的信号处理函数。
void ChldEXIT(int sig);  // 子进程的信号处理函数。

int main()
{
  // 忽略全部的信号,不希望被打扰。
  for (int ii=1;ii<=64;ii++) signal(ii,SIG_IGN);

  // 设置信号,在shell状态下可用 "kill 进程号" 或 "Ctrl+c" 正常终止些进程
  // 但请不要用 "kill -9 +进程号" 强行终止
  signal(SIGTERM,FathEXIT); signal(SIGINT,FathEXIT);  // SIGTERM 15 SIGINT 2

  while (true)
  {
    if (fork()>0) // 父进程的流程。
    {
      sleep(5); continue;
    }
    else          // 子进程的流程。
    {
      // 子进程需要重新设置信号。
      signal(SIGTERM,ChldEXIT);   // 子进程的退出函数与父进程不一样。
      signal(SIGINT ,SIG_IGN);    // 子进程不需要捕获SIGINT信号。

      while (true)
      {
        cout << "子进程" << getpid() << "正在运行中。\n"; sleep(3); continue;
      }
    }
  }
}

// 父进程的信号处理函数。
void FathEXIT(int sig)
{
  // 以下代码是为了防止信号处理函数在执行的过程中再次被信号中断。
  signal(SIGINT,SIG_IGN); signal(SIGTERM,SIG_IGN);

  cout << "父进程退出,sig=" << sig << endl;

  kill(0,SIGTERM);     // 向全部的子进程发送15的信号,通知它们退出。

  // 在这里增加释放资源的代码(全局的资源)。

  exit(0);
}

// 子进程的信号处理函数。
void ChldEXIT(int sig)
{
  // 以下代码是为了防止信号处理函数在执行的过程中再次被信号中断。
  signal(SIGINT,SIG_IGN); signal(SIGTERM,SIG_IGN);

  cout << "子进程" << getpid() << "退出,sig=" << sig << endl;

  // 在这里增加释放资源的代码(只释放子进程的资源)。

  exit(0);
}

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

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

相关文章

批发行业手机入库识别单据 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、手机入库好处 1. 便捷性高&#xff1a;可以随时随地通过手机进行入库操作&#xff0c;不受时间和地点的限制&#xff0c;方便库存管理者或相关人员及时记录商品或物品的入库信息。 2. 提高效率&#xff1a;采用手机端快速数据录入&#xff0c;避免了繁琐的手工记录&#x…

Linux从0到1——基础IO(上)【文件描述符/重定向/缓冲区】

Linux从0到1——基础IO&#xff08;上&#xff09; 1. 预备知识2. 复习一下常见的C语言文件接口3. 系统调用接口3.1 函数传参小技巧——标志位3.2 使用系统调用接口3.2.1 open3.2.2 write3.2.3 read 4. 文件描述符fd4.1 fd的本质4.2 理解struct file结构体4.3 fd的分配规则 5. …

学习分享:解析电商 API 接入的技术重难点及解决方案

在当今电商业务迅速发展的时代&#xff0c;接入电商 API 已成为许多企业提升竞争力和拓展业务的重要手段。然而&#xff0c;在这个过程中&#xff0c;往往会遇到一系列的技术重难点。本文将深入解析这些问题&#xff0c;并提供相应的解决方案。 一、电商 API 接入的技术重难点 …

按摩虎口穴位的作用

按摩虎口穴位的作用 虎口穴位是人体手背上的一个重要穴位&#xff0c;它位于手指掌侧第一指骨和第二指骨之间的凹陷处。 按摩虎口穴位有很多益处&#xff0c;包括&#xff1a; 缓解头痛和眼疲劳&#xff1a; 按摩虎口穴位可以缓解头痛和眼疲劳&#xff0c;特别是由于长时间使用…

未授权访问漏洞系列详解①!

Redis未授权访问漏洞 Redis 默认情况下&#xff0c;会绑定在 0.0.0.0:6379 &#xff0c;如果没有进行采用相关的策略&#xff0c;比如添加防火墙规则避免其他非信任来源 ip 访问等&#xff0c;这样将会将 Redis 服务暴露到公网上&#xff0c;如果在没有设置密码认证(一般为空)的…

Golang | Leetcode Golang题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; func coinChange(coins []int, amount int) int {var (dfs func(x int) int // x金额 最少硬币个数memo make(map[int]int) // 记忆化)dfs func(x int) int {//边界if x 0 {return 0} else if x < 0 {return math.MaxInt32}//记…

wangpang.xingkong(tou)

目录 client │ ├── client.h/c connect login recv send getcommand pausecommand putscommand │ ├── main.c 登陆&监听 │ ├── str_util.h/c 分割token字符串 conf │ └── server.conf server │ ├── config.h/c 读取文…

Android----Depth Anything尝鲜 小米手机部署

题目要求&#xff1a;了解Depth Anything (以及Depth Anything v2)基本原理&#xff0c;创新点。 Depth Anything 论文&#xff1a;Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data 参考代码&#xff1a;Depth-Anything-Android GitHub 分析&#xff1a; …

深度学习在生物信息学中的应用

一、深度学习概念定义 深度学习&#xff08;Deep Learning&#xff09;是机器学习的一个子领域&#xff0c;它基于人工神经网络&#xff0c;尤其是深度神经网络。深度学习的核心思想是通过学习数据的表示层次和抽象层次&#xff0c;让机器能够具有类似于人类的分析学习能力。深…

lowbit(x)

返回x的最右边的一位1以及后面的所有数 x 1010 lowbit(x) 10x 101000 lowbit(x) 1000 一个整数的负数是补码(取反1) 应用&#xff1a; 求二进制中1的个数 题目 给定一个长度为 n 的数列&#xff0c;请你求出数列中每个数的二进制表示中 1的个数。 输入格式 第一行包…

uvm_config_db 和 uvm_resource_db :

uvm_config_db class my_driver extends uvm_driver;int my_param;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual task run_phase(uvm_phase phase);// 在组件内部获取配置值if (!uvm_config_db#(int)::get(this, ""…

python3 pyside6图形库学习笔记及实践(四)

目录 前言列表控件(QListWidget)创建列表增删插改查添加元素插入元素删除元素修改元素查找元素 常用信号和槽currentItemChangeditemChangedclear 列表排序列表的上下文菜单 图形视图框架简介框架核心图元类(QGraphicsItem)场景类(QGraphicsScene)视图类(QGraphicsView)交互机制…

守护数据安全:有效应对.hmallox勒索病毒的策略

引言 近年来&#xff0c;随着网络技术的飞速发展&#xff0c;勒索病毒成为网络安全领域的一大威胁。其中&#xff0c;.hmallox勒索病毒作为malox勒索软件家族的新变种&#xff0c;给个人和企业带来了极大的数据安全和经济损失风险。本文将对.hmallox勒索病毒进行详细介绍&…

机器学习用python还是R,哪个更好?

机器学习领域中&#xff0c;Python和R都是非常流行的编程语言&#xff0c;它们各有优势和特点&#xff1a; Python: 优势: 拥有丰富的库和框架&#xff0c;如scikit-learn、TensorFlow、PyTorch等&#xff0c;适合各种级别的机器学习任务。语法简洁清晰&#xff0c;易于学习。社…

3DM游戏运行库合集离线安装包2024最新版

3DM游戏运行库合集离线安装包是一款由国内最大的游戏玩家论坛社区3DM推出的集成式游戏运行库合集软件&#xff0c;旨在解决玩家在玩游戏时遇到的运行库缺失或错误问题。该软件包含多种常用的系统运行库组件&#xff0c;支持32位和64位操作系统&#xff0c;能够自动识别系统版本…

LeetCode每日一题_572.另一棵树的子树

解题思路&#xff1a; Step1:首先我们要知道如何判断两颗树相同&#xff0c;思路就是遍历每个节点&#xff0c;然后判断是否均相等&#xff0c;需要用递归来实现。代码如下所示&#xff1a; public static boolean equals(TreeNode t1,TreeNode t2){if(t1null&&t2null…

[Java]面向对象,从浅到深

快速入门 计算机的核心作用就是处理数据, 变量用来存储单个数据, 数组用来储存一批数据, 对象用来存储一类数据 什么是对象: 对象就是一种特殊的数据结构, 在java中万物皆对象 面相对象编程的好处: 更加符合人类思维习惯 类和实例对象 在java中必须先设计类, 才能根据类创…

git学习入门1——下载安装与添加用户标识设置name与Email

想法是这样的&#xff0c;先是自己工作闲暇之余在学习C语言&#xff0c;在跟一个某平台的机构学习C语言的基础知识&#xff0c;空闲之余学习了几天&#xff0c;想起了之前学习过程中某学员提出的git每日提交代码的那个表格记录&#xff0c;忽然想起自己也先学习git的使用。 先是…

三、初识工作流

基础操作 拖动操作&#xff0c;按住鼠标左键可以拖动 放大缩小&#xff0c;可以通过鼠标滚轮操作 节点含义 1、大模型 2、正向与负向提示词(生成图片的文字信息) 3、图片尺寸设定&#xff08;批次大小为每次生产图片数量&#xff09; 4、采样器 5、图片渲染 6、保存图像 设…

Reed-Solomon纠错码——RS(255,251)学习及实现

1、基础知识 1.1 有限域 有限域_百度百科​​​​​​ 伽罗华域&#xff08;Galois Field&#xff09;上的四则运算_模2的伽罗华域乘法-CSDN博客 1.2 RS&#xff08;255,251&#xff09; 里德-所罗门码&#xff08;一种前向错误更正的信道编码&#xff09;_百度百科 本原…