【openwrt】libubox组件——uloop_process

news2025/7/20 17:11:28

uloop_process

    • uloop_process主要数据结构
      • struct list_head processes
      • struct uloop_process
    • uloop_process主要函数
      • uloop_handle_processes
    • uloop_process原理
    • uloop_process使用示例

uloop_process 是 Libubox 提供的一个进程管理工具,它主要用来等待子进程工作的结束,一般需要配合 fork一起使用。

uloop_process主要数据结构

struct list_head processes

static struct list_head processes = LIST_HEAD_INIT(processes);

processes是一个全局链表,用于管理多个struct uloop_process.

struct uloop_process

struct uloop_process
{
	struct list_head list;
	bool pending;

	uloop_process_handler cb;
	pid_t pid;
};

struct uloop_process用来描述一个子进程,其中:

  • list 用于将struct uloop_process结构加入全局processes链表
  • pending标志此进程是否需要挂起(初始化时此参数务必置0)
  • cb是此进程运行结束后的回调函数
  • pid是进程ID(通常=fork()的返回值)

uloop_process主要函数

int uloop_process_add(struct uloop_process *p);
int uloop_process_delete(struct uloop_process *p);
  • uloop_process_add()函数是向全局链表中新增一个uloop_process
  • uloop_process_delete()函数是从全局链表中删除指定的uloop_process

uloop_handle_processes

static void uloop_handle_processes(void)

uloop_handle_processes()函数只会在uloop_run中被调用,用户不会主动调用此函数,它的作用是等待uloop_process ->pid对应的子进程运行结束,然后调用uloop_process ->cb函数。

uloop_process原理

在这里插入图片描述

uloop_init()中会重定向SIGCHLD信号处理函数为uloop_sigchld(),在这个函数中会设置do_sigchld=1
当子进程主动退出或者被Kill后,就会向父进程发送SIGCHLD信号
uloop_run()中会根据do_sigchld决定是否要处理子进程,如果需要处理,首先会调用uloop_process_delete从全局链表中删除子进程,然后调用struct uloop_process->cb函数。

uloop_process使用示例

示例中,父进程fork出一个子进程,然后让子进程执行test程序,随后将子进程添加到uloop进程管理队列,在子进程结束后,父进程会调用uloop_process->cb函数。

父进程源码:

#include <unistd.h>
#include <signal.h>
#include "libubus.h"


void u_process_cb(struct uloop_process *c, int ret)
{
	printf("[%s]currnt pid=%d\n",__FUNCTION__,getpid());
	printf("[%s]child process exec end,ret=%d\n",__FUNCTION__,ret);
}

int main(int argc, char **argv)
{
	static char *arg[]={"./test",NULL};
	struct uloop_process u;
	memset((void *)&u,0,sizeof(u));
	uloop_init();

	u.cb = u_process_cb;
	u.pid = fork();

	if(u.pid == 0)//child process
	{
		execvp(arg[0],arg);
	}

	if(uloop_process_add(&u) == 0)
	{
		printf("[father] father pid=%d child pid=%d\n",getpid(),u.pid);
		printf("[father] add pid(%d) to uloop_process success!\n",u.pid);
	}
	else
	{
		printf("[father] add pid(%d) to uloop_process failed!\n",u.pid);
	}

	uloop_run();
	uloop_done();

	return 0;
}

子进程源码如下:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
	printf("[child]Enter\n");
	sleep(2);
	printf("[child]Exit\n");
	return 0;
}

执行结果如下:

# ./uloop_process
[father] father pid=25305 child pid=25306
[father] add pid(25306) to uloop_process success!

[child]Enter # 子进程开始运行
[child]Exit  # 子进程退出

[u_process_cb]currnt pid=25305 # 父进程调用cb
[u_process_cb]child process exec end,ret=0

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

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

相关文章

DAP和IAP

DAP和IAP DAP模型&#xff1a;通过训练样本学习一组属性分类器直接预测测试样本的属性。 IAP模型&#xff1a;通过训练样本的类别&#xff0c;&#xff08;多分类器&#xff09;间接预测测试样本的属性。 两者之间的区别&#xff1a;属性分类器的学习方式&#xff0c;DAP是一组…

labelme做标注

1.anaconda 安装 anaconda下载地址如下&#xff1a; 官网 一直下一步&#xff0c;注意下面这个地方 同时手动配置环境变量&#xff0c;下面三个路径需添加 Anaconda安装路径 Anaconda安装路径\Scripts Anaconda安装路径\Library\bin 最后测试一下 cmd 依次输入 conda…

云原生周刊 | 百家争鸣的边缘计算时代即将到来?| 2022-11-14

今年的 KubeCon 大会有一个很奇怪的现象&#xff0c;到场的几乎都是小公司&#xff0c;没有大公司。可能是因为这些大公司恰好在这个时候都有自己的活动要举办&#xff0c;也有可能是他们正在快马加鞭研发他们的边缘计算方案&#xff1f;因为 Gartner 预测到 2025 年&#xff0…

Mybatis—LanguageDriver

LanguageDriver主要用于构造SqlSource和ParameterHandler&#xff0c;从LanguageDriver在Mybatis中调用链路来看&#xff0c;Configuration#newParameterHandler通过调用LanguageDriver#createParameterHandler完成构建ParameterHandler&#xff0c;通过调用LanguageDriver#cre…

缺流量时代,App们需要如何突围?

距离上一个现象级的应用抖音出现已经过去了6年&#xff0c;如今App市场万马齐喑&#xff0c;巨头创新不断&#xff0c;中小团队异军突起的App黄金时代一去不返。 你的App里多久没有出现过一款新应用了&#xff1f; 距离上一个现象级的应用抖音出现已经过去了6年&#xff0c;那…

基于加权对立和贪婪搜索多模态工程问题的黑猩猩优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【网络安全】处理应急响应的简单方法

目录 一、应急响应 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;分类 二、如何处理 &#xff08;1&#xff09;查看日志 &#xff08;2&#xff09;封堵ip &#xff08;3&#xff09;代码加固 &#xff08;4&#xff09;安装防火墙 &#xff08;5&#x…

sqli通关笔记

sqli通关学习笔记 目录sqli通关学习笔记Less-1Less-2Less-3Less-4Less-5Less-5Less-6导入导出文件相关的操作Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16增删改函数介绍Less-17HTTP 头部介绍Less-18Less-19Less-20Less-21Less-22高级注入&#xff0c…

【网络篇】第十四篇——HTTP协议(一)(附带电视剧李浔同款爱心+端口号被恶意占用如何清除)

目录 HTTP简介 基本性质 URI和URL urlencode和urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式(爱心代码端口清理) ​ HTTP简介 超文本传输协议是一个用于传输超媒体文档的应用层协议。它是为web浏览器与web服务器之间的通信而设计的&#xff0c;但也可以用…

【DPDK】使用 Open vSwitch * 采用 DPDK 帧间 VM NFV 应用程序

一、概述 数据面开发套件 (DPDK)提供高性能数据包处理库和用户空间驱动程序。从Open vSwitch (OVS)版本 2.4 (http://openvswitch.org/releases/NEWS-2.4.0)开始&#xff0c;我们可以进行 OVS 中&#xff0c;使用 DPDK 优化 vHost 路径。DPDK 支持后的 OVS 中可用的 2.2 版。 …

JavaSE——包装类、装箱与拆箱

目录 一、基本概念 1.1 八种包装类及使用场景 1.2 装箱与拆箱的概念 二、以Integer包装类为例 2.1 Integer的构造方法 2.2 通过常量获取最大值与最小值 2.3 自动装箱和自动拆箱&#xff08;非常重要的面试题&#xff09; 三、Integer常用方法 3.1 手动拆箱&#xff08;过时…

LeetCode-剑指44-数字序列中某一位的数字

1、找规律 我们通过找规律可以发现&#xff0c;当位数为xxx时&#xff0c;其占用的位数为x910x−1x\times9\times10^{x-1}x910x−1。因此我们可以不断循环并增大位数xxx直至n−x<x910x−1n-x<x\times9\times10^{x-1}n−x<x910x−1&#xff0c;此时数字落在剩余的位数…

HTTP协议加强

HTTP协议加强[TOC](HTTP协议加强)一、HTTP协议简介1.1 什么是通信1.2 什么是通信协议1.3 HTTP二、HTTP请求2.1 什么是HTTP请求消息2.2 HTTP请求消息的组成部分三、HTTP响应3.1 什么是HTTP响应消息3.2 HTTP响应消息的组成部分四、HTTP请求方法4.1 什么是HTTP请求方法4.2 HTTP的请…

接口性能调优的方法,这有11种,你知道几种?

​当我们谈到“软件测试”时&#xff0c;是指软件测试的相关工作&#xff0c;如单元测试、集成测试、系统测试等&#xff0c;但不局限于动态测试&#xff0c;也可以包括静态测试——需求评审、设计评审、代码评审和借助工具进行代码静态分析。 接口性能调优共11种方法&#xf…

Nftea: 世界杯文化、 NFT与 期权的首度碰撞

体育文化&#xff0c;正在成为加密行业发展的新驱动力 卡塔尔世界杯即将在2022年11月20日开幕&#xff0c;随着开赛日期的临近&#xff0c;作为四年一度的足球狂欢盛会&#xff0c;也吊足了全球足球球迷们的胃口。当然&#xff0c;从上个世纪开始&#xff0c;体育文化就成为了商…

Slurm作业管理系统常用命令和教程

Slurm &#xff08; Simple Linux Utility for Resource Management &#xff09;是开源的、具有容错性和高度可扩展大型和小型 Linux集群资源管理和作业调度系统。超级计算系统可利用 Slurm 进行资源和作业管理&#xff0c;以避免相互干扰&#xff0c;提高运行效率。所有需运行…

charles

charles中文名叫青花瓷&#xff0c;是一款基于HTTP协议的代理服务器。通过电脑或浏览器的代理来截取请求和请求结果&#xff0c;达到抓包并进行数据分析的目的。charles可以截取HTTP和HTTPS的网络封包&#xff0c;支持重发网络请求、修改网络请求参数、流量控制等场景 安装 由…

LeetCode刷题(python版)——Topic65.有效数字

一、题设 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; &#xff08;可选&…

Vue:搭建前端项目-----我给你打个样

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 家人们好久不见&#xff0c;这次我们继续上干货&#xff0c;我们来介绍一下如何使用vue搭建一个前端项目&#xff1b; 在这里我会…

pytest fixture 中的使用包信scope skip conftest.py 和参数化等功能使用

pytest中所谓的夹具&#xff1a; fixture scope参数详解&#xff1a; scope&#xff1a; 表示fixture共享夹具的范围&#xff0c;有以下五个范围 function 功能&#xff1a; 在函数或方法运行时执行fixture函数的功能 默认作用域 class 功能&#xff1a;在类运行时调用一次。…