system系統調用返回值判斷命令是否執行成功

来源:http://www.cnblogs.com/chaozhu/archive/2016/07/07/5650455.html
-Advertisement-
Play Games

system函數對返回值的處理,涉及3個階段: 階段1:創建子進程等準備工作。如果失敗,返回-1。 階段2:調用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執行結束(參見備註1),原因值被寫入到status的低8~15比特位中。system的man中只說明瞭會寫了127這個值, ...


 system函數對返回值的處理,涉及3個階段:

階段1:創建子進程等準備工作。如果失敗,返回-1。 階段2:調用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執行結束(參見備註1),原因值被寫入到status的低8~15比特位中。system的man中只說明瞭會寫了127這個值,但實測發現還會寫126等值。 階段3:如果shell腳本正常執行結束,將shell返回值填到status的低8~15比特位中。 備註1: 只要能夠調用到/bin/sh,並且執行shell過程中沒有被其他信號異常中斷,都算正常結束。 比如:不管shell腳本中返回什麼原因值,是0還是非0,都算正常執行結束。即使shell腳本不存在或沒有執行許可權,也都算正常執行結束。 如果shell腳本執行過程中被強制kill掉等情況則算異常結束。   如何判斷階段2中,shell腳本是否正常執行結束呢?系統提供了巨集:WIFEXITED(status)。如果WIFEXITED(status)為真,則說明正常結束。 如何取得階段3中的shell返回值?你可以直接通過右移8bit來實現,但安全的做法是使用系統提供的巨集:WEXITSTATUS(status)。     由於我們一般在shell腳本中會通過返回值判斷本腳本是否正常執行,如果成功返回0,失敗返回正數。 所以綜上,判斷一個system函數調用shell腳本是否正常結束的方法應該是如下3個條件同時成立: (1)-1 != status (2)WIFEXITED(status)為真 (3)0 == WEXITSTATUS(status)   因此,我們可以由下麵代碼判斷命令是否正常執行並返回:
 1 bool mySystem(const char *command)
 2 {
 3     int status;
 4     status = system(command);  
 5   
 6     if (-1 == status)  
 7     {  
 8         printf("mySystem: system error!");  
 9         return false;
10     }  
11     else  
12     {  
13         if (WIFEXITED(status))  
14         {  
15             if (0 == WEXITSTATUS(status))  
16             {  
17                 return true; 
18             }               
19             printf("mySystem: run shell script fail, script exit code: %d\n", WEXITSTATUS(status));  
20             return false;   
21         }    
22         printf("mySystem: exit status = [%d]\n", WEXITSTATUS(status));   
23         return false;
24     }  
25 }
26     
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • IDENT_CURRENT('TableName')為當前的最大標識值,IDENT_INCR('TableName')為設置的標識值增量, 兩者相加即為下一個標識值 SELECT IDENT_CURRENT('TableName') + IDENT_INCR('TableName'); 參考鏈接:h ...
  • 介紹 有時候我們需要原封不動的複製一張表的表結構來生成一張新表,MYSQL提供了兩種便捷的方法。 例: CREATE TABLE tb_base( id INT NOT NULL PRIMARY KEY, name VARCHAR(10), KEY ix_name (name)) ENGINE='M ...
  • 協同過濾推薦(Collaborative Filtering Recommendation) 基於用戶的協同過濾分為兩個步驟: 1. 找到與目標用戶興趣相似的用戶集合 2. 找到這個集合中用戶喜歡的、並且目標用戶沒有聽說過的物品推薦給目標用戶 計算兩個用戶的興趣相似度: 設 N(u) 為用戶 u 喜 ...
  • Mongodb 簡單入門(個人學習小記) 1、安裝並註冊成服務:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 --logpath "E:\mongodbDataBase\accountValueBase\log\lo ...
  • 1,執行完全備份 這是直接備份到g盤的情況 backup database 資料庫名 to disk='g:\database.bak' 這是備份到備份設備的情況,with init是初始化,也就是直接覆蓋 bakup database 資料庫名 to mybackup with init 2,執行 ...
  • 我會用幾篇博客總結一下在Linux中進程之間通信的幾種方法,我會把這個開頭的摘要部分在這個系列的每篇博客中都打出來 進程之間通信的方式 管道 消息隊列 信號 信號量 共用存儲區 套接字(socket) 進程間通信(三)—信號量傳送門:http://www.cnblogs.com/lenomirei/ ...
  • 參考博客“Linux啟動文件、設置環境變數的位置”(http://www.2cto.com/os/201305/208251.html) 在不可取的root許可權的時候可以選擇編輯~/.bashrc文件,加入相應的配置代碼,這樣當登錄時以及每次打開新的shell時,該文件都被讀取。 而在可取的root ...
  • 一、下載軟體包 1、下載地址 二、安裝 1、java 2、Android sdk 查看源 根據需要進行安裝 如果google很慢,可以改hosts 3、gradle 加入環境變數 三、編譯測試 參考網址 http://askubuntu.com/questions/464755/how-to-ins ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...