popen開啟進程,寫入數據

通過管道(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 是一個針對多種不同設備類型打…