通过管道(popen)启动 SDIWAN_WEB 进程并写入 JSON 数据的过程可以分为以下步骤,结合代码示例和关键注意事项进行说明:


1. 核心代码示例

#include <stdio.h>
#include <json-c/json.h>int main() {// 1. 创建 JSON 对象json_object *root = json_object_new_object();json_object_object_add(root, "action", json_object_new_string("create_wan"));json_object_object_add(root, "param", json_object_new_string("eth0"));// 2. 将 JSON 对象转换为字符串const char *json_str = json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY);// 3. 通过 popen 启动 SDIWAN_WEB 进程(写入模式)FILE *fp = popen("SDIWAN_WEB", "w");if (!fp) {perror("popen failed");return -1;}// 4. 写入 JSON 数据到管道size_t json_len = strlen(json_str);size_t written = fwrite(json_str, 1, json_len, fp);if (written != json_len) {perror("fwrite failed");pclose(fp);return -1;}// 5. 关闭管道并检查子进程退出状态int status = pclose(fp);if (status == -1) {perror("pclose failed");return -1;} else if (WIFEXITED(status)) {int exit_code = WEXITSTATUS(status);printf("SDIWAN_WEB exited with code: %d\n", exit_code);}// 6. 释放 JSON 对象json_object_put(root);return 0;
}

2. 关键步骤解析

(1) 创建 JSON 对象
  • 作用:构造需要传递给 SDIWAN_WEB 的配置数据。
  • 代码
    json_object *root = json_object_new_object();
    json_object_object_add(root, "action", json_object_new_string("create_wan"));
    json_object_object_add(root, "param", json_object_new_string("eth0"));
    
  • 说明
    • 使用 json-c 库动态构建 JSON 对象。
    • 示例中添加了 actionparam 字段,实际需根据 SDIWAN_WEB 的接口定义填充数据。
(2) 转换为字符串
  • 作用:将 JSON 对象序列化为字符串,便于通过管道传输。
  • 代码
    const char *json_str = json_object_to_json_string_ext(root, JSON_C_TO_STRING_PRETTY);
    
  • 说明
    • JSON_C_TO_STRING_PRETTY 使输出格式化(可读性更好),若需紧凑格式可替换为 JSON_C_TO_STRING_PLAIN
(3) 启动子进程
  • 作用:通过 popen 启动 SDIWAN_WEB 进程,并建立写入管道。
  • 代码
    FILE *fp = popen("SDIWAN_WEB", "w");
    
  • 说明
    • "w" 表示以写入模式打开管道,子进程的标准输入(stdin)连接到管道。
    • SDIWAN_WEB 需为可执行文件的完整路径(如 /usr/bin/SDIWAN_WEB)。
(4) 写入数据
  • 作用:将 JSON 字符串写入管道,由子进程读取。
  • 代码
    size_t written = fwrite(json_str, 1, json_len, fp);
    
  • 说明
    • 必须检查 fwrite 返回值,确保完整写入数据。
    • 若写入失败,需调用 pclose 关闭管道并释放资源。
(5) 关闭管道并检查状态
  • 作用:关闭管道并获取子进程退出状态。
  • 代码
    int status = pclose(fp);
    if (WIFEXITED(status)) {int exit_code = WEXITSTATUS(status);printf("Exit code: %d\n", exit_code);
    }
    
  • 说明
    • pclose 会等待子进程结束并返回其退出状态。
    • WIFEXITED(status) 判断子进程是否正常退出,WEXITSTATUS 获取退出码。

3. 注意事项

(1) 错误处理
  • 关键点
    • 检查 popen 是否返回 NULL(如可执行文件不存在或权限不足)。
    • 检查 fwrite 是否完整写入数据。
    • 检查 pclose 是否成功,并处理子进程异常退出(如被信号终止)。
(2) 数据完整性
  • 关键点
    • 确保 JSON 字符串以 \0 结尾,或明确指定长度(如示例中的 json_len)。
    • SDIWAN_WEB 需要严格的数据格式(如结尾换行符),需在写入时添加。
(3) 安全性
  • 关键点
    • 避免将用户输入直接拼接到命令中(popen 的参数是固定字符串,无命令注入风险)。
    • 确保 JSON 数据来源可信,防止恶意数据导致子进程异常。
(4) 性能优化
  • 关键点
    • 对于大数据量,可分块写入(如循环调用 fwrite)。
    • 使用 fflush(fp) 强制刷新缓冲区,确保数据及时到达子进程。

4. 扩展场景

(1) 双向通信
  • 若需从 SDIWAN_WEB 读取响应,可使用 popen 的读取模式("r"),但需注意:
    • 写入和读取需分两个独立管道。
    • 可能需要多线程或 select 实现并发读写。
(2) 超时控制
  • 通过 alarmselect 设置超时,避免子进程卡死:
    #include <unistd.h>
    #include <sys/select.h>// 设置 5 秒超时
    alarm(5);
    int status = pclose(fp);
    alarm(0);
    

5. 总结

通过 popen 启动 SDIWAN_WEB 并写入 JSON 数据的流程如下:

  1. 构造 JSON → 2. 启动进程 → 3. 写入数据 → 4. 关闭管道 → 5. 处理结果

关键在于确保数据完整传输、妥善处理错误,并根据实际需求扩展超时、双向通信等功能。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉的四项基本任务辨析

计算机视觉是使计算机能理解采集设备采集的图像视频的一门学科&#xff0c;目的是让计算机实现人的视觉功能——对客观世界的三维场景的感知、识别和理解。换句话说&#xff0c;要让计算机具备通过二维图像认识三维环境的能力。 目录 三个阶段 视觉层级 基本任务 技术难点…

iostat 系统IO监控命令学习

一、iostat 命令描述 “iostat”命令用于监测系统输入/输出设备的负载情况&#xff0c;其通过观察设备处于活跃状态的时间与平均传输速率之间的关系来实现这一目的。该命令会生成报告&#xff0c;这些报告可用于调整系统配置&#xff0c;以更好地平衡物理磁盘之间的输入/输出负…

jenkins使用ssh方式连接gitee 公钥、私钥配置、指纹

前言 Gitee 提供了基于 SSH 协议的 Git 服务&#xff0c;jenkins可使用ssh方式连接gitee&#xff0c;拉取代码、提交tag等&#xff1b;使用ssh 连接&#xff0c;相比用户名密码方式&#xff0c;可省去因密码变更而引起的jenkins关联修改。 gitee生成、添加 SSH 公钥 生成SSH…

如何在Android设备上删除多个联系人(3种方法)

如果您想清理安卓手机&#xff0c;或者只是想删除旧的、不需要的联系人&#xff0c;或者删除多个联系人&#xff0c;有三种有效的方法可供选择。无论您是想手动删除安卓手机上的联系人&#xff0c;还是使用专用工具&#xff0c;都可以按照以下步骤操作。方法1&#xff1a;如何通…

Angular进阶之十三:Angular全新控制流:革命性的模板语法升级

随着Angular v17的发布&#xff0c;框架带来了革命性的控制流语法&#xff0c;彻底改变了我们编写模板的方式。这些改进不仅仅是语法糖——它们提升了性能、开发体验和代码可维护性。 为什么我们需要新的控制流&#xff1f; 在之前的Angular版本中&#xff0c;我们使用结构指令…

【Redis】string字符串

目录 一.常见命令 1.1.SET 1.2.GET 1.3.MGET 1.4.MSET 1.5.SETNX 二.计数命令 2.1.INCR 2.2.INCRBY 2.3.DECR 2.4.DECYBY 2.5.INCRBYFLOAT 三 . 其他命令 3.1.APPEND 3.2.GETRANGE 3.3.SETRANGE 3.4.STRLEN 四. 字符串类型内部编码 五. 典型使用场…

Nginx 学习

通过网盘分享的文件&#xff1a;Nginx 链接: https://pan.baidu.com/s/1dCc7FoND90H_x7rvRUXJqg 提取码: yyds 通过网盘分享的文件&#xff1a;Tomcat 链接: https://pan.baidu.com/s/1nj_5j_66gS_YHUAX1C25jg 提取码: yyds Nginx安装、启动 安装依赖库 #安装C编译器 yum insta…

Java、Android及计算机基础面试题总结

1. String、StringBuffer、StringBuilder区别特性StringStringBufferStringBuilder可变性不可变可变可变线程安全是是(synchronized)否性能低(频繁操作时)中等高场景字符串常量多线程字符串操作单线程字符串操作2. 接口和抽象类的区别特性接口(Interface)抽象类(Abstract Class…

数据集相关类代码回顾理解 | sns.distplot\%matplotlib inline\sns.scatterplot

【PyTorch】单目标检测项目 目录 os.path.join sns.distplot adjust_brightness os.path.join fullPath2imgos.path.join(path2data,"Training400",prefix,imgName[id_]) 使用os.path.join函数&#xff0c;智能地处理不同操作系统中的路径分隔符问题&#xff0…

JavaScript:链式调用

概念 链式调用&#xff08;Method Chaining&#xff09;是 JavaScript 中一种常见的编程模式&#xff0c;允许通过连续调用对象的方法来简化代码。这种模式的核心在于每个方法返回调用对象本身&#xff08;通常是 this&#xff09;&#xff0c;从而可以继续调用其他方法。 链式…

龙芯(loongson) ls2k1000 openwrt

PC环境&#xff1a;Linux Mint 21.3安装依赖sudo apt install build-essential clang flex bison g gawk gcc-multilib g-multilib gettext git libncurses-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget下载源码&#xff1a;git clone https://gitee.co…

算法438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。示例 1:输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc&…

Go语言中的闭包详解

闭包在Go语言中是一个能够访问并操作其外部作用域变量的函数&#xff0c;即使外部函数已经执行完毕。闭包由函数体和其引用的环境&#xff08;外部变量&#xff09;组成&#xff0c;及&#xff1a;闭包 函数 环境。闭包的特性&#xff1a;捕获外部变量&#xff1a;内部函数可…

【DL学习笔记】Dataset类功能以及自定义

文章目录一、Dataset 与 DataLoader 功能介绍抽象类Dataset的作用DataLoader 作用两者关系二、自定义Dataset类Dataset的三个重要方法__len__()方法_getitem__()方法__init__ 方法三、现成的torchvision.datasets模块MNIST举例COCODetection举例torchvision.datasets.MNIST使用…

Python爬虫实战:研究python_reference库,构建技术研究数据系统

1. 引言 1.1 研究背景与意义 在大数据时代,数据已成为重要的生产要素。互联网作为全球最大的信息库,蕴含着海量有价值的数据。如何从纷繁复杂的网络信息中快速、准确地提取所需数据,成为各行各业面临的重要课题。网络爬虫技术作为数据获取的关键手段,能够模拟人类浏览网页…

Web开发系列-第15章 项目部署-Docker

第15章 项目部署-Docker Docker技术能够避免部署对服务器环境的依赖&#xff0c;减少复杂的部署流程。 轻松部署各种常见软件、Java项目 参考文档&#xff1a;‌&#xfeff;‬‌&#xfeff;‍‍‌‍⁠⁠&#xfeff;‍‍&#xfeff;‬‌‍‌‬⁠‌‬第十五章&#xff1a;…

微软无界鼠标(Mouse without Borders)安装及使用:多台电脑共用鼠标键盘

文章目录一、写在前面二、下载安装1、两台电脑都下载安装2、被控端3、控制端主机三、使用一、写在前面 在办公中&#xff0c;我们经常会遇到这种场景&#xff0c;自己带着笔记本电脑外加公司配置的台式机。由于两台电脑&#xff0c;所以就需要搭配两套键盘鼠标。对于有限的办公…

nodejs 编程基础01-NPM包管理

1:npm 包管理介绍 npm 是nodejs 的包管理工具&#xff0c;类似于java 的maven 和 gradle 等&#xff0c;用来解决nodejs 的依赖包问题 使用场景&#xff1a;1. 从NPM 服务骑上下载或拉去别人编写好的第三方包到本地进行使用2. 将自己编写代码或软件包发布到npm 服务器供他人使用…

基于Mediapipe_Unity_Plugin实现手势识别

GitHub - homuler/MediaPipeUnityPlugin: Unity plugin to run MediaPipehttps://github.com/homuler/MediaPipeUnityPlugin 实现了以下&#xff1a; public enum HandGesture { None, Stop, ThumbsUp, Victory, OK, OpenHand } 核心脚本&#xff1a…

Android 项目构建编译概述

主要内容是Android AOSP源码的管理方式&#xff0c;项目源码的构建和编译&#xff0c;用到比如git、repo、gerrit一些命令工具&#xff0c;以及使用Soong编译系统&#xff0c;编写Android.bp文件的格式样式。 1. Android操作系统堆栈概述 Android 是一个针对多种不同设备类型打…