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

system()函数启用新进程占有原进程的文件描述符表的问题

我在A程序中占用了/dev/video0这个独占模式的设备文件,在A中用system函数启用了B程序,B程序的代码中并不包含对/dev/video0的访问,但是我发现B程序也占用了/dev/video0,并且我在A程序中关闭了/dev/video0后,A程序不再占用/dev/video0,但是发现B程序依然占用着/dev/video0这是为什么呢?

当你在A程序中打开/dev/video0并启动B程序时,B程序继承了A程序打开的所有文件描述符,包括/dev/video0的文件描述符。这就导致了B程序也可以访问/dev/video0,即使B程序的代码中并不包含对/dev/video0的访问。

当A程序关闭/dev/video0时,只是让A程序不再使用该设备,但是并没有真正地释放该设备的控制权,因为B程序依然在使用它。因此,当你尝试再次打开/dev/video0时,你会得到“设备忙”的错误提示,因为此时该设备已经被B程序占用,而不是被A程序占用。要想让B程序释放/dev/video0,你需要杀死B程序或让B程序自行关闭/dev/video0。

我的目的是在A中启用B程序,并且在A中可以杀死B,并且B不占用/dev/video0,那么有什么办法呢?
您可以考虑在A程序中使用fork()函数创建一个子进程,然后在子进程中调用B程序。这样,子进程和B程序之间是独立的进程,不会共享A程序的资源,包括/dev/video0。同时,由于子进程和A程序是不同的进程,所以A程序可以通过杀死子进程的方式来结束B程序的执行。
示例代码如下:

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>using namespace std;int main() {pid_t pid = fork();if (pid == -1) {// fork() failedcerr << "Failed to fork()" << endl;return 1;} else if (pid == 0) {// child processexecl("/path/to/B", "B", NULL);cerr << "Failed to execute B" << endl;return 1;} else {// parent process// wait for child process to terminateint status;waitpid(pid, &status, 0);if (WIFEXITED(status)) {cout << "Child process exited with status " << WEXITSTATUS(status) << endl;}}return 0;
}

在子进程中使用execl()函数调用B程序。注意,execl()函数的第一个参数是B程序的路径,第二个参数是B程序的名称,第三个参数是一个空指针。execl()函数调用成功后,子进程会替换成B程序的进程,而且B程序与A程序是独立的进程,不会共享任何资源。

在父进程中使用waitpid()函数等待子进程结束,并获取子进程的退出状态。如果子进程正常结束,可以通过WEXITSTATUS()宏获取子进程的退出码。

另外,如果您需要在A程序中占用/dev/video0这个设备文件,建议您在打开和关闭设备文件时加上文件锁,避免其他进程对设备文件的非法访问。

execl()系列函数来实现相同的目的。execl()系列函数会用指定的可执行程序替换当前进程,所以它不会创建新的进程,也不会复制原来进程的文件描述符表。
execl()函数会用指定的可执行程序来替换当前进程,如果替换成功,那么之后的代码将会在新的程序中执行,如果替换失败,则execl()函数会直接返回,并且不会继续执行后面的代码。
在调用execl()函数时,当前进程的代码段、数据段等内存区域会被指定的可执行程序替换,即当前进程会被新的程序所取代,新程序从main()函数开始执行,原先的程序和它所占用的内存空间都会被释放掉,也就是说,调用execl()函数后,当前进程的程序完全变成了新程序。这种方式常常用于实现进程的程序替换,比如常用的Unix命令行工具,如ls、grep、ps等等,这些工具其实都是通过execl()等函数实现的。

不是同一个进程id号。使用fork()创建新进程后,新进程会复制父进程的地址空间、文件描述符表等资源,但是会拥有一个新的进程id号。然后在新进程中使用execl()函数执行B程序时,新进程的地址空间、文件描述符表等都会被替换为B程序的内容,但是进程id号不会改变。所以A程序和B程序是通过两个不同的进程id号来运行的。

使用 vfork() 函数创建新进程时,新进程会共享父进程的地址空间和部分资源,包括文件描述符、共享内存和信号处理函数等。但是,由于 vfork() 函数不会像 fork() 函数一样完全复制父进程的地址空间,所以需要特别注意以下几点:

新进程和原来的父进程有不同的进程ID。在 vfork() 函数创建的新进程中,子进程的进程ID会被设置为0。一旦子进程开始执行,它会通过调用 exec() 函数来加载新的程序代码并替换自己的地址空间,此时子进程的进程ID将会改变。

父进程和子进程共享地址空间。由于新进程和原来的父进程共享同一地址空间,因此它们可以直接访问相同的变量和函数。这也意味着,如果子进程修改了某个变量的值,父进程中对应的变量值也会发生改变。

子进程会阻塞父进程。在 vfork() 函数创建新进程时,父进程会被阻塞,直到子进程执行完毕或者调用 exec() 函数为止。因此,在使用 vfork() 函数时,需要确保子进程能够尽快执行完毕,否则可能会导致父进程长时间被阻塞。

综上所述,虽然新进程和原来的父进程共享部分资源和文件描述符,但是它们的进程ID是不同的,同时也需要注意避免在子进程中修改父进程的数据,以及确保子进程能够尽快执行完毕,以避免对父进程的阻塞。

相关文章:

system()函数启用新进程占有原进程的文件描述符表的问题

我在A程序中占用了/dev/video0这个独占模式的设备文件&#xff0c;在A中用system函数启用了B程序&#xff0c;B程序的代码中并不包含对/dev/video0的访问&#xff0c;但是我发现B程序也占用了/dev/video0&#xff0c;并且我在A程序中关闭了/dev/video0后&#xff0c;A程序不再占…...

nignx(安装,正反代理,安装tomcat设置反向代理,ip透传)

1安装nginx 安装wget Yum install -y wget 下载(链接从官网找到右键获取) 以下过程root 安装gcc Yum -y install gcc c 安装pcre Yum install -y pcre pcre-devel Openssl Yum install -y openssl openssl-devel 安装zlib Yum install -y zlib zlib-devel 安装make Yum inst…...

sklearn模块常用内容解析笔记

文章目录 回归模型评价指标R2_score预备知识R2_score计算公式r2_score使用方法注意事项参考文献回归模型评价指标R2_score 回归模型的性能的评价指标主要有:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score。但是当量纲不同时,RMSE、MAE、MSE难以衡量模…...

我的 System Verilog 学习记录(2)

引言 从本文开始&#xff0c;就开始系统学习 System Verilog &#xff0c;不只是语法&#xff0c;还有结合 Questa Sim 的实际编程练习、Debug。 本文简单介绍 System Verilog 语言的用途以及学习的必要性。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08…...

【调研报告】Monorepo 和 Multirepo 的风格对比及使用示例

带有权重的Monorepo和Multirepo对比 功能/特性MonorepoMultirepoMonorepo权重值Multirepo权重值代码管理管理多个代码库更加复杂管理单个代码库更加简单37依赖管理可以简化依赖管理依赖冲突可能会更加困难73构建和部署构建和部署更加容易构建和部署可能需要更多的配置82团队协…...

Retrofit源码分析

文章目录一、简介二、源码分析2.1Retrofit的本质流程2.2源码分析2.2.1 创建Retrofit实例步骤1步骤2步骤3步骤4步骤5总结2.2.2创建网络请求接口的实例外观模式 & 代理模式1.外观模式2. 代理模式步骤3步骤4总结2.2.3执行网络请求同步请求OkHttpCall.execute()1.发送请求过程2…...

Mybatis-Plus入门系列(20) -兼容多种数据库

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言方案分析1. 分页2. XML自定义SQL案例演示1. 配置2. 简单分页查询3. 带方言的分页查询参考前言 在我们实际开发软件产品过程中&#xff0c;数据库的类型可能不是确定的&#xff0c;也有客户…...

JetPack板块—Android X解析

Android Jetpack简述 AndroidX 是Android团队用于在Jetpack中开发&#xff0c;测试&#xff0c;打包&#xff0c;发布和版本管理的开源项目。相比于原来的Android Support库,AndroidX 可以称得上是一次重大的升级改进。 和Support库一样&#xff0c;AndroidX与Android 操作系…...

C++学习笔记-数字

当我们使用数字时&#xff0c;通常我们使用原始数据类型&#xff0c;例如 int&#xff0c;short&#xff0c;long&#xff0c;float 和 double 等。数字数据类型&#xff0c;它们的可能值和取值范围在讨论 C 数据类型时已经解释了。 C 定义数字 我们已经在之前笔记的各种实例…...

Nginx——Nginx的基础原理

摘要 Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 是由俄罗斯人 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;它已经在该站点运行超过两年半了。…...

服务端开发Java之备战秋招面试篇1

在这个面试造火箭工作拧螺丝的时代背景下&#xff0c;感觉不是很好&#xff0c;不过还好也是拿到了还行的offer&#xff0c;准备去实习了&#xff0c;接下来就是边实习边准备秋招了&#xff0c;这半年把&#xff08;技术栈八股文面经算法题项目&#xff09;吃透&#xff0c;希望…...

【C++的OpenCV】第三课-OpenCV图像加载和显示

我们开始学习OpenCV一、OpenCV加载图片和显示图片1.1 imread()函数的介绍1.2 cv::namedWindow()函数的介绍1.4 imshow()函数介绍1.5 Mat容器介绍二、 代码实例&#xff08;带注释&#xff09;2.1 代码2.2 执行结果一、OpenCV加载图片和显示图片 本章节中&#xff0c;将会学习到…...

【面试1v1实景模拟】Spring事务 一文到底

老面👴:小伙子,了解Spring的事务吗? 解读🔔:这个必须了解,不了解直接挂~😂😂😂,但面试官肯定不是想听你了解两个字,他是想让你简单的介绍下。 笑小枫🍁:了解,事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。为…...

Neuron Selectivity Transfer 原理与代码解析

paper&#xff1a;Like What You Like: Knowledge Distill via Neuron Selectivity Transfercode&#xff1a;https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/NST.py本文的创新点本文探索了一种新型的知识 - 神经元的选择性知识&#xff0c…...

vue项目关闭子页面,并更新父页面的数据

今天下午是一个非常痛苦的&#xff0c;想要实现一个功能&#xff1a; 父页面打开了一个新的页面&#xff08;浏览器打开一个新的窗口&#xff09;&#xff0c;并在子页面提交数据之后&#xff0c;父页面的数据要同步更新。 难点&#xff1a;父页面是一个表格列表&#xff0c;…...

第五次作业:修改redis的配置文件使得windows的图形界面客户端可以连接redis服务器

1. 安装 Redis 依赖 Redis 是基于 C语言编写的&#xff0c;因此首先需要安装 Redis 所需要的 gcc 依赖&#xff1a; yum install -y gcc tcl 2、上传安装文件 将下载好的 redis-6.2.7.tar.gz 安装包上传到虚拟机的任意目录&#xff08;一般推荐上传到 /usr/local/src目录&am…...

【11】FreeRTOS的延时函数

目录1.延时函数-介绍2.相对延时函数-解析2.1函数prvAddCurrentTaskToDelayedList-解析2.3滴答定时器中断服务函数xPortSysTickHandler()-解析2.4函数taskSWITCH_DELAYED_LISTS() -解析3.延时函数-实验4.总结1.延时函数-介绍 函数描述vTaskDelay()相对延时xTaskDelayUntil()绝对…...

Vue页面组成及常用属性

一、Vue页面组成 目前的项目中&#xff0c;Vue页面都是采用组件套娃的形式&#xff0c;由一个一个的组件拼接而成整个页面。一个组件就是一个.vue文件。组件通常由template和script两部分组成&#xff1a; template部分&#xff1a;页面展示的具体元素内容&#xff0c;比如文字…...

j6-IO流泛型集合多线程注解反射Socket

IO流 1 JDK API的使用 2 io简介 输入流用来读取in 输出流用来写出Out 在Java中&#xff0c;根据处理的数据单位不同&#xff0c;分为字节流和字符流 继承结构 java.io包&#xff1a; File 字节流&#xff1a;针对二进制文件 InputStream --FileInputStream --BufferedInputStre…...

创业能否成功?这几个因素很重要!

创业能否成功&#xff1f;这几个因素很重要&#xff01; 2023-02-22 19:06:53 大家好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 上周末跟朋友一起钓鱼&#xff0c;他跟吐槽现在生意越来越难做。他是我身边可以说是创业很成功的例子&#…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...