Linux進程--函數 system 和 popen 的區別

system()popen() 是 C 語言中用于執行外部命令的兩個函數,它們的功能類似,但在使用方式和特性上有一些區別。

system()

system() 函數允許您在程序中執行外部命令,并等待該命令執行完成后繼續執行程序。其基本語法如下:

int system(const char *command);
  • command 是一個字符串,包含您要執行的命令。這可以是任何有效的命令,就像您在命令行中輸入的一樣。

  • system() 函數將返回執行結果。如果成功執行了命令,則返回值為命令的退出狀態碼。如果無法執行命令,則返回 -1。

  • system() 函數會阻塞當前進程,直到執行的命令完成。

示例:

#include <stdio.h>
#include <stdlib.h>int main() {int status = system("ls -l");if (status == -1) {printf("Failed to execute command\n");} else {printf("Command executed successfully with exit status: %d\n", status);}return 0;
}

?執行結果:

popen()

popen() 函數允許您在程序中執行外部命令,并建立一個到該命令的管道,可以通過管道進行輸入和輸出。其基本語法如下:

  • commandmode 參數分別與 system() 函數的參數相同,用于指定要執行的命令和管道的打開模式。

  • popen() 函數返回一個指向 FILE 結構的指針,您可以使用該指針來讀取或寫入命令的輸入和輸出。

  • popen() 函數允許并發執行多個命令,并且可以通過管道進行通信。

示例:

#include <stdio.h>int main() {FILE *fp;char buffer[1024];fp = popen("ls -l", "r");if (fp == NULL) {printf("Failed to execute command\n");return 1;}while (fgets(buffer, sizeof(buffer), fp) != NULL) {printf("%s", buffer);}pclose(fp);return 0;
}

執行結果:

這段代碼的作用是執行一個外部命令 ls -l(列出當前目錄下的文件和文件夾,并顯示詳細信息),并將命令的輸出逐行打印到標準輸出(終端)上。

讓我們逐行解釋代碼:

  1. #include <stdio.h>:包含了標準輸入輸出的頭文件。

  2. int main():主函數的定義。

  3. FILE *fp;:聲明了一個指向 FILE 結構的指針 fp,它將被用作 popen() 返回的管道。

  4. char buffer[1024];:聲明了一個用于存儲命令輸出的緩沖區。

  5. fp = popen("ls -l", "r");:調用 popen() 函數執行外部命令 ls -l,并將其輸出連接到管道上。模式 "r" 表示只讀模式,因此 fp 將用于從管道讀取命令的輸出。

  6. if (fp == NULL):檢查 popen() 函數的返回值,如果返回空指針,則表示執行命令失敗。

  7. printf("Failed to execute command\n");:打印錯誤信息。

  8. return 1;:退出程序,返回錯誤代碼。

  9. while (fgets(buffer, sizeof(buffer), fp) != NULL):使用 fgets() 函數從管道中讀取命令的輸出,并將其逐行存儲到 buffer 緩沖區中。循環會繼續,直到 fgets() 函數返回 NULL,表示已經讀取完全部輸出。

  10. printf("%s", buffer);:打印緩沖區中的內容,即命令的輸出。

  11. pclose(fp);:關閉由 popen() 打開的管道,并等待命令執行完畢。

  12. return 0;:退出程序,返回成功代碼。

system 和 popen的區別:

  1. 返回類型

    • system() 返回命令的退出狀態碼。
    • popen() 返回一個文件指針,用于讀取或寫入命令的輸入和輸出。
  2. 阻塞特性

    • system() 函數會阻塞當前進程,直到執行的命令完成。
    • popen() 函數允許并發執行多個命令,并且您可以在不等待命令完成的情況下繼續執行程序。
  3. 輸入輸出

    • system() 函數只能捕獲命令的退出狀態碼,無法直接獲取命令的輸入和輸出。
    • popen() 函數可以通過管道進行輸入和輸出,允許更靈活的交互。

綜上所述,如果您只需要執行簡單的命令并等待其完成,可以使用 system() 函數。如果您需要與命令進行交互,或者需要同時執行多個命令,可以使用 popen() 函數。

問:是不是雖然沒有ls -l的運行結果沒在終端顯示,但是它已經執行了?

????????是的,即使沒有使用 printf 或其他輸出函數將 popen() 命令的輸出顯示在終端上,該命令仍然會在后臺執行,并將結果寫入到管道中。

????????即便沒有讀取管道中的輸出,popen() 也會執行給定的命令,并等待命令執行完成。只是程序沒有處理這些輸出而已。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14548.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用腳本執行SQL Server 數據庫壓縮備份?

SQL Server 數據庫壓縮備份是否可以實現&#xff1f; 使用時&#xff0c;SQL Server 數據庫會變得非常大&#xff0c;備份也是如此。它們占用大量磁盤空間&#xff0c;并且每次備份數據庫或四處移動都非常耗時。因此&#xff0c;您可能想知道是否有任何方法可以創建壓縮備份。…

pikachu靶場(SQL注入基于布爾的盲注)python實現

import requests from bs4 import BeautifulSoupurl "http://localhost:8086/pikachu-master/vul/sqli/sqli_blind_b.php"def get_database_name(url):dataname # 初始化一個空字符串用于存儲數據庫名dict abcdefghijklmnopqrstuvwxyz # 數據庫名可能存在這些…

docker實戰之搭建MYSQL8.0主從同步

目錄 環境配置容器創建主服務器創建MYSQL容器新增my.cnf文件創建用戶并授權 從服務器創建MYSQL容器新增my.cnf文件重啟MYSQL容器配置主從同步 驗證主從同步彩蛋 MySQL 主從同步&#xff08;Master-Slave Replication&#xff09;是一種常用的解決方案&#xff0c;它允許一個主服…

Golang實現根據文件后綴刪除文件和遞歸刪除文件

概述 這個功能會非常強大&#xff0c;因為在日常工作中&#xff0c;我通常會遇到需要批量刪除文件的場景&#xff0c;通過這個方法&#xff0c;再結合我的另一個 命令行開發框架&#xff0c;能夠很輕松的開發出這個功能。 代碼 package zdpgo_fileimport ("errors"…

LabVIEW與串口通訊在運行一段時間后出現數據接收中斷的問題

這些問題可能與硬件、軟件或通信協議有關。以下是詳細的原因分析和可能的解決方案&#xff1a; 一、硬件原因 串口線纜或接口問題&#xff1a; 由于長時間使用&#xff0c;串口線纜可能出現接觸不良或損壞。接口松動也可能導致通訊中斷。 解決方案&#xff1a;檢查并更換串口…

C語言基礎-內存申請和釋放

在C語言中&#xff0c;malloc 和 free 是用于動態內存分配和釋放的函數。而在C中&#xff0c;new 和 delete 提供了類似的功能&#xff0c;但它們之間有一些重要的區別。 1. malloc 和 free malloc malloc 函數用于在堆上動態地分配指定字節數的內存。它的原型在 stdlib.h 頭…

【Text2SQL 經典模型】X-SQL

論文&#xff1a;X-SQL: reinforce schema representation with context ???? Microsoft, arXiv:1908.08113 X-SQL 與 SQLova 類似&#xff0c;使用 BERT style 的 PLM 來獲得 representation&#xff0c;只是融合 NL question 和 table schema 的信息的方式不太一樣&#…

一種獲取java代碼結構的實現思路

一種獲取java代碼結構的實現思路 有時,我們需要獲取java文件里的代碼結構,即,只需要里面的class定義、方法聲明、屬性定義。不需要額外的方法實現 這里提供一下實現思路: 采用語法解析器Tree-sitter對java代碼進行解析,獲取里面的方法實現遍歷第一步獲取到的方法列表,在源…

Linux c開發線程鎖和條件變量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("線程等待喚醒,鎖定互斥量...\n");…

代碼隨想錄算法訓練營第十七天 | 110. 平衡二叉樹、257. 二叉樹的所有路徑、404. 左葉子之和

[LeetCode] 110. 平衡二叉樹 [LeetCode] 110. 平衡二叉樹 文章解釋 [LeetCode] 110. 平衡二叉樹 視頻解釋 給定一個二叉樹&#xff0c;判斷它是否是 平衡二叉樹 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;true示例 2&#xff1a; 輸…

HTTP 響應分割漏洞

HTTP 響應分割漏洞 1.漏洞概述2.漏洞案例 1.漏洞概述 HTTP 響應拆分發生在以下情況&#xff1a; 數據通過不受信任的來源&#xff08;最常見的是 HTTP 請求&#xff09;進入 Web 應用程序。該數據包含在發送給 Web 用戶的 HTTP 響應標頭中&#xff0c;且未經過惡意字符驗證。…

CSS常用的兩種定位方式

在CSS中&#xff0c;absolute 和 relative 是兩種常用的定位方式&#xff0c;分別通過 position 屬性進行設置。它們用于控制元素在頁面中的位置。理解這兩種定位方式對于布局和設計響應式頁面非常重要。 position: relative 定義 relative 定位是相對自身原始位置進行偏移。…

Python 魂斗羅的音效和動漫效果

一、實現游戲音效 音效是游戲中不可或缺的一部分&#xff0c;它可以為游戲增添氛圍和趣味性。在 Pygame 中&#xff0c;我們可以使用 pygame.mixer 模塊來播放音效。下面是一個簡單的示例代碼&#xff0c;演示如何在游戲中播放音效&#xff1a; import pygamepygame.mixer.init…

windows平臺vcpkg安裝

1. 克隆vcpkg倉庫 git clone https://github.com/microsoft/vcpkg 2.運行bootstrap-vcpkg.bat下載vcpkg.exe 3.運行驗證 4.使用VCPKG安裝OPENSSL 5.安裝成功

VC++學習(1)——環境準備,參考文檔等,初步入門VC++

目錄 引出環境準備&#xff0c;參考文檔第一講 初步入門鍵盤按下的消息鼠標左鍵按下報錯源碼新建一個工程 總結 引出 VC學習&#xff08;1&#xff09;——環境準備&#xff0c;參考文檔等&#xff0c;初步入門VC C是一門編程語言,他的語法標準和語言特性是全球統一的 VC是微…

計算機系統概述習題

選擇題 電子計算機問世至今&#xff0c;新型計算機不斷推陳出新&#xff0c;不管怎么更新&#xff0c;依然具有“存儲程序”的特點&#xff0c;最早提出這種概念的是(B) A. 巴貝奇 B. 馮*諾伊曼 C. 帕斯卡 D. 貝爾 B下列描述中___是正確的。 A. 控制器能理解&#xff0c;解釋…

中國主要城市房價指數數據集(2011-2024)

數據來源&#xff1a;東方財富網 時間跨度&#xff1a;2011年1月 - 2024年4月 數據范圍&#xff1a;中國主要城市 包含指標&#xff1a; 日期、城市 新建商品住宅價格指數-同比 新建商品住宅價格指數-環比 新建商品住宅價格指數-定基 二手住宅價格指數-環比 二手住宅價格指…

Visual Studio 調試及快捷鍵

文章目錄 原文連接環境一、調試器的基本使用1、更改執行流2、快速執行某一條代碼斷點設置條件斷點查看內存信息查看調用堆棧查看寄存器信息設置監視斷點調試二、快捷鍵一、窗口快捷鍵二、查找相關快捷鍵三、代碼快捷鍵原文連接 【教程】visual studio debug 技巧總結 環境 一…

OpenCASCADE Draw模塊TKDraw項目問題修改

1.問題 在調試Draw模塊代碼時&#xff0c;出現一個小問題&#xff0c;導致無法正常運行 如下&#xff1a; 2.代碼跟蹤 通過代碼跟蹤發現時一個數組越界問題&#xff0c;在此處添加了判斷處理&#xff0c;程序可以正常調試

Golang使用HTTP框架zdpgo_resty實現文件下載

核心代碼 代碼解析&#xff1a; client.SetOutputDirectory("Downloads") 設置下載目錄client.R().SetOutput("test.go").Get("http://127.0.0.1:3333/download 指定下載文件名并進行下載 // 設置輸出目錄路徑&#xff0c;如果目錄不存在&#xff…