【Linux C与C++一线开发实践】之三 Linux多进程

2023-05-16

进程是操作系统结构的基础。进程是一个具有独立功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个基本单位。Linux作为一个多用户、多任务的操作系统,必定支持多进程。多进程是现代操作系统的基本特征。一个进程也可以通俗理解为就是我们运行的一个独立的程序。

一个程序可以有多个进程,每个进程都会有个唯一的标志符,PID,就像我们身份证一样。PID是进程运行时系统随机分配的,在进程运行时,PID是不会改变的,进程终止后,PID就会被系统回收。

进程的创建

实际项目中我们很少在一个编译项目中创建多个进程,多进程一般体现在不同编译工程,每个工程都是独立的,一般就是某类服务器,多个服务一起工作,就构建出多进程环境。从而可以引申出负载均衡,分布式部署等技术解决方案。一个服务一般是单进程多线程模型。

1.使用fork创建进程

Linux可以通过执行系统调用函数fork来创建新进程。由fork创建的新进程被称为子进程。该函数调用一次,但返回两次。两次返回的区别是在子进程中返回值是0,而在父进程中返回值是子进程的PID。如果失败,则在父进程程序中返回-1,并且可以通过errno得到错误码。这个函数相当于克隆一个进程。 从调用fork之后代码复制了一份,父,子进程分开执行后面代码,先后顺序无规律,由系统分配。

#include <iostream>
using namespace std;

#include <unistd.h>
#include <stdio.h>
int main()
{
	pid_t fpid;
	int count = 0;
	fpid = fork();
	if(fpid < 0){
		cout << "failed to fork";
	} else if(fpid == 0){
		// 子进程执行
		cout << "I am the child process, my pid is " << getpid() << endl;
		count++;
	} else {
		// 父进程执行
		cout << "I am the parent process, my pid is " << getpid() << endl;
		cout << "fpid = " << fpid << endl;
		count++;
	}
	printf("result: %d\n", count);
	return 0;
}

输出:
在这里插入图片描述

2.使用exec创建进程

exec就是在调用进程(调用exec函数的进程)内部执行一个可执行文件。这里的可执行文件可以是二进制文件,也可以是任何Linux下可执行的脚步文件。相当于借一个壳运行,exec启动的新进程替换当前进程,且PID不变。

// 执行/bin/pwd
#include <unistd.h>

int main()
{
	//执行/bin目录下的pwd, 注意argv[0]必须要有,即执行系统程序至少一个参数,自定义程序可以不需要
	execl("/bin/pwd", "abcdef", NULL);
	return 0;
}

编译运行这个程序,相当于执行了pwd命令一样。

3.使用system创建进程

system函数通过调用shell程序来执行所传入的命令(效率低),相当于先fork(),在exec,且源进程需要等子进程运行完后再继续。
其源码具体实现步骤:
(1)fork一个子进程。
(2)在子进程中调用exec函数去执行command命令(system函数参数)。
(3)在父进程中调用wait等待子进程结束。如果fork失败,system()返回-1。如果exec执行成功,则返回command通过exit或return返回的值。如果exec执行失败,system()函数返回127。如果command为NULL,则system()返回非0值,一般为1.

// 源码
int system(const char * cmdstring)
{
    pid_t pid;
    int status;
    if(cmdstring == NULL){
        return (1);
    }

    if((pid = fork())<0){
        status = -1;
    } else if(pid == 0){
         execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
        _exit(127); //子进程正常执行则不会执行此语句
    } else{
        while(waitpid(pid, &status, 0) < 0){
            if(errno != EINTER){
                status = -1;
                break;
             }
        }
    }
    return status;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux C与C++一线开发实践】之三 Linux多进程 的相关文章

  • CMakeList的基本写法

    最近需要自己写CMakaList xff0c 所以简要写一下一些基本的操作 为图实用 xff0c 只写了常用的简单操作 1 确定cmake最低版本需求 span class hljs function span class hljs tit
  • SLAM的一点认识

    SLAM的一点认识 本人邮箱 xff1a sylvester0510 64 163 com xff0c 欢迎交流讨论 xff0c 欢迎转载 xff0c 转载请注明网址http blog csdn net u010128736 一 我与SLA
  • ORB-SLAM2详解(六)闭环检测

    ORB SLAM2详解 xff08 六 xff09 闭环检测 本人邮箱 xff1a sylvester0510 64 163 com xff0c 欢迎交流讨论 xff0c 欢迎转载 xff0c 转载请注明网址http blog csdn n
  • FreeRTOS系列|任务创建和删除

    任务创建和删除 1 任务创建和删除API函数 xTaskCreate 函数 xff1a 动态创建一个新的任务 xff0c 每个任务都需要RAM来保存任务状态 任务控制块 43 任务栈 xff0c 此接口采用动态分配内存资源 BaseType
  • 深度学习如何做特征工程?

    深度能自动获取特征 只是对某些领域而言的 实际上深度学习只是能自动对输入的低阶特征进行组合 变换 xff0c 得到高阶特征 对于图像处理之类的领域来说 xff0c 像素点就可以作为低阶特征输入 xff0c 组合 变换得到的高阶特征也有比较好
  • Git:《Git学习视频》学习笔记

    视频地址 xff1a 黑马程序员 Git学习视频 目录 xff1a 一Git介绍二Git与SVN的区别 速度结构其他 三Git基本命令的使用掌握 如何学习git指令常见命令单人开发配置帐号信息一般只需配置一次全局帐号即可查看日志起别名版本回
  • 海康云台摄像机 ISAPI 的签名机制与语音传输

    由于海康HikVision Hik 平台摄像机的SDK不支持Arm Linux平台 xff0c 为了跨平台的兼容性 xff0c 只能使用ISAPI作为控制或接收相机数据的方式 xff0c ISAPI是Hik的一套HTTP通信协议 xff0c
  • 无人机中的坐标系与相机姿态计算

    球坐标系 球坐标系是三维坐标系中的一种 xff0c 在无人机中一般使用球坐标系来表示相机姿态 xff0c 相机姿态的坐标是相对于无人机的 xff0c 而无人机的飞行姿态则是相对于大地坐标系的 这里我们使用的相机是2自由度的相机 xff0c
  • 【Ubuntu】安装中文输入法、终端不支持中文的解决方法

    一 中文输入法安装 1 安装汉语语言包 sudo apt install fcitx sudo apt install language pack zh hans 2 安装google拼音输入法 sudo apt install fcitx
  • 【Qt】QtCreator中配置clang-format

    1 安装clang format sudo apt install clang format 2 添加插件Beautifier 在QtCreator gt Help gt About Plugins 中添加插件Beautifer 添加后要重
  • 【TX2】TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口

    1 简述 TX2开发板系统默认串口有ttyS0 调试口 ttyTHS1 ttyTHS2 ttyTHS3 通过修改设备树文件 可以新增三个串口 2 设备树 设备树中关于串口部分的描述 2 1 基础配置 注意 在这里状态都配置成禁止 statu
  • 【STM32】入门(六):I2C协议

    STM32 STM32单片机总目录 1 常见I2C设备 EEPROM 温湿度传感器 xff0c 例如 xff1a AHT10 电量计 xff0c 例如 xff1a TI的BQ34Z100 日历时钟 模数或数模转换器 2 I2C总线结构 I2
  • 【STM32】入门(九):HAL库学习

    STM32 STM32单片机总目录 1 简述 STD xff08 Standard Peripheral Libraries xff09 标准库 xff1a 面向过程 xff0c 仅仅是在寄存器上的一层封装操作 HAL xff08 Hard
  • 【STM32】入门(十一):初识uCOS-III

    STM32 STM32单片机总目录 1 轮询 中断 多任务对比 2 什么是任务 如果您学过linux xff0c 那么任务可以理解为线程 在代码中的体现就是线程函数 xff0c 一个函数中有个无限循环函数 xff0c 并且永不返回 例如 x
  • FreeRTOS系列|任务挂起和恢复

    任务挂起和恢复 1 任务挂起和恢复API函数 vTaskSuspend 函数 xff1a 将任务置于挂起状态 span class token keyword void span span class token function vTas
  • vscode 代码特效插件 让你的代码写出火花

    如果你经常觉得写代码是一件无趣的事情 xff0c 那么这里有一款插件推荐给你 xff0c 可以给你枯燥无味的写代码时添加一些趣味 这款插件名字叫做 power mode 现在我来教你如何下载它 xff0c 并且使用它 1 下载插件 打开vs
  • 【STM32】入门(十二):实时操作系统RTOS和通用操作系统GPOS的区别

    STM32 STM32单片机总目录 1 简述 实时操作系统 RTOS xff0c Real Time Operating System 通用操作系统 GPOS xff0c General Purpose Operating System 2
  • 【STM32】入门(十四):FreeRTOS-任务

    1 简述 FreeRTOS应用程序由一组独立的任务构成 在任何时间点 xff0c 应用程序中只能执行一个任务 xff0c FreeRTOS调度器负责决定所要执行的任务 每个任务在自己的上下文中执行 xff0c 不依赖于系统内的其他任务或 F
  • 【SBUS】一文看懂SBUS协议

    STM32 STM32单片机总目录 1 简介 S BUS是一个串行通信协议 xff0c S BUS是FUTABA提出的舵机控制总线 xff0c S bus使用RS232C串口的硬件协议作为自己的硬件运行基础 使用TTL电平 xff0c 即3
  • 【ubuntu】ubuntu14.04、16.04、18.04 LTS版本支持时间

    0 历史版本下载地址 http old releases ubuntu com releases http mirrors 163 com ubuntu releases 1 官网说明 https wiki ubuntu com Kerne

随机推荐

  • 树莓派,tx2硬件对比

    具体参考以下链接 http www exuehao com article detail 14
  • Gazebo中的平面运动 (urdf+控制器设置)及所遇见的问题

    这里有个视频 xff0c 介绍怎么让机器人在平面运动 xff08 在x和y方向上进行平移 xff09 xff1a https www youtube com watch v 61 mtSpqObg9X4 如果你们看不了视频也没关系 xff0
  • 2014年年终总结:写书成长,承载收获

    雪花纷飞 xff0c 任你飘落凝成魅力的雪域之城 美丽的守候 xff0c 望长城内外惟余莽莽 数着北国春夏秋冬的每一天 xff0c 2014 的日历天天换新装 xff0c 消瘦了你的时光 但丰盈了我的渴望 2014 年 xff0c 在你的身
  • 漫步数学分析三十五——乘法法则与梯度

    微分中另一个有名的法则是乘法法则或莱布尼兹法则 定 理 6 令 A R n 是开集 xff0c f A R m g A R 是可微函数 xff0c 那么 g f 是可微的并且对于 x A D g f x R n R m 为 D
  • CAN总线标准及协议分析

    目录 1 简介 2 CAN总线标准 2 1 物理层 2 1 1 CAN总线网络 2 1 2 CAN收发器 2 1 3 CAN信号表示 2 1 4 CAN信号传输 2 2 数据链路层 2 2 1 数据帧 2 2 1 1 帧起始与结束帧 2 2
  • Eclipse中Python开发环境搭建详细图文教程(Windows环境)

    转载请注明出处 Eclipse可便捷的集成开发Python xff0c 这里我们为了更好地使用Python进行机器学习 xff0c 首先进行Eclipse中Python开发环境的搭建 一 下载EclipseIDE 下载地址 xff1a ht
  • FreeRTOS系列|多任务调度

    多任务调度 1 多任务启动流程 多任务启动流程如下表所示 启动后以下各函数由上至下依次执行含义osKernelStart 启动内核vTaskStartScheduler 启动任务调度器xPortStartScheduler 启动调度器prv
  • Realsense d435i驱动安装、配置及校准

    写在前面 本文是在ubuntu20 04下安装 xff0c 其它版本大同小异 可能出现的问题 xff0c 主要由各自安装相关库版本不一致导致 xff0c 故问题不一 xff0c 但一般很好解决 xff0c 正常情况下不会出现 Intel R
  • Realsense d435i内参、外参标定

    使用工具code utils imu utils kalibr对Realsense d435i 内参 外参标定 本文介绍上述工具的安装 xff0c 及标定方法 一 code utils安装 1 建立工作空间 mkdir p calibrat
  • 从零完成slam实战,以Vins-Fusion为例

    写在前面 1 本文以vins fusion为例 xff0c 是因为其框架正统 简单清晰 xff0c 易于调试和后续改进 xff1b camera imu外参及同步时间td可实时估计 xff1b 已有融合gps方案且较为容易可添加融合其它传感
  • Vins-Fusion整体框架,数据流分析

    一 VINS Fusion VINS Fusion是一种基于优化的多传感器状态估计器 xff0c 可实现自主应用 xff08 无人机 汽车和AR VR xff09 的精确自我定位 VINS Fusion是VINS Mono的扩展 xff0c
  • Vins-Fusion初始化位姿——3D-2D:PNP求解当前帧位姿

    继上一篇博文Vins Fusion 外参camera imu 标定 xff0c 本文继续介绍Vins Fusion初始化时 xff0c 通过PNP求解当前帧位姿 一 3D 2D xff1a PNP PnP是求解3D到2D点对运动的估计 xf
  • ORB_SLAM3启动流程以stereo_inertial_realsense_D435i为例

    概述 ORB SLAM3 是第一个同时具备纯视觉 xff08 visual xff09 数据处理 视觉 43 惯性 xff08 visual inertial xff09 数据处理 和构建多地图 xff08 multi map xff09
  • BoW(词袋)模型详细介绍

    最近学习BoW模型 xff0c 将自己网上看到的资料及对论文的理解 xff0c 将BoW模型总结如下 xff01 BoW模型 Bag of words model BoW model 最早出现在自然语言处理 xff08 Natural La
  • Win10 VS Code + CMake STM32开发环境

    Win10 VS Code 43 CMake STM32开发环境 软件 软件安装与环境变量的配置不多讲 xff0c 这步都搞不定还是老老实实用MDK把 VS Codecmake 插件 c c 43 43 插件mingwgcc arm non
  • makefile 转 cmake STM32工程

    makefile 转 cmake STM32工程 STM32开发由MDK转到 vscode好久了 每次新建工程 xff0c stm32cubemx生成代码都要手动把makefile转到cmake xff0c 好烦 xff0c 特别一下小的频
  • STM32使用FreeRtos + C++

    编译环境 MDK5 25 gcc arm7 2 C文件不可包含CPP的头文件 C调用C 43 43 函数 在CPP文件内编写C函数 xff0c 头文件声明 头文件不可出现C 43 43 关键字 在main中调用此函数作为程序入口即可 voi
  • FreeRTOS系列|时间管理

    FreeRTOS时间管理 1 FreeRTOS延时函数 在使用FreeRTOS的过程中经常会在一个任务中使用延时函数对该任务延时 xff0c 当执行延时函数的时候就会进行任务切换 xff0c 并且此任务就会进入阻塞态 xff0c 直到延时完
  • 【Linux C与C++一线开发实践】之一 Linux概述与Linux C++开发

    Linux系统启动的基本过程 对于一台Linux系统来说 xff0c 用户按下开机按钮后 xff0c 一共要经历如下几个过程
  • 【Linux C与C++一线开发实践】之三 Linux多进程

    进程是操作系统结构的基础 进程是一个具有独立功能的程序对某个数据集在处理机上的执行过程 xff0c 进程也是作为资源分配的一个基本单位 Linux作为一个多用户 多任务的操作系统 xff0c 必定支持多进程 多进程是现代操作系统的基本特征