linux系統編程之進程(七):system()函數使用【轉】

本文轉載自:http://www.cnblogs.com/mickole/p/3187974.html

一,system()理解

功能:system()函數調用“/bin/sh -c command”執行特定的命令,阻塞當前進程直到command命令執行完畢

原型:

int system(const char *command);

返回值:

如果無法啟動shell運行命令,system將返回127;出現不能執行system調用的其他錯誤時返回-1。如果system能夠順利執行,返回那個命令的退出碼。

說明:

man幫助:

?????? #include <stdlib.h>

?????? int system(const char *command);

DESCRIPTION?
???????system()? executes a command specified in command by calling /bin/sh -c?
?????? command, and returns after the command has been completed.
? During exe-?
?????? cution? of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT?
?????? will be ignored.

RETURN VALUE?
?????? The value returned is -1 on? error? (e.g.?? fork(2)? failed),? and? the?
?????? return? status? of the command otherwise.? This latter return status is?
?????? in the format specified in wait(2).? Thus, the exit code of the command?
?????? will? be? WEXITSTATUS(status).?? In case /bin/sh could not be executed,?
?????? the exit status will be that of a command that does exit(127).

?????? If the value of command is NULL, system() returns non-zero if the shell?
?????? is available, and zero if not.

?????? system() does not affect the wait status of any other children.

二,system()函數原理

system函數執行時,會調用fork、execve、waitpid等函數。

linux版system函數的源碼:

復制代碼
int system(const char * cmdstring){pid_t pid;int status;if(cmdstring == NULL){        return (1);}if((pid = fork())<0){status = -1;}else if(pid == 0){execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);_exit(127); //子進程正常執行則不會執行此語句}else{while(waitpid(pid, &status, 0) < 0){
                 if(errno != EINTER){status = -1;break;}}}return status;}
復制代碼
  • 函數說明?
    system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命>令執行完后隨即返回原調用的進程。?
    在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。?
    返回值?
    =-1:出現錯誤??
    =0:調用成功但是沒有出現子進程??
    >0:成功退出的子進程的id?
    如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值>。如果system()調用成功則最后會返回?
    執行shell命令后的返回值,但是此返回值也有可能為 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。?
    附加說明?
    在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。

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)?
注意:?
根據以上分析,當shell腳本不存在、沒有執行權限等場景下時,以上前2個條件仍會成立,此時WEXITSTATUS(status)為127,126等數值。?
所以,我們在shell腳本中不能將127,126等數值定義為返回值,否則無法區分中是shell的返回值,還是調用shell腳本異常的原因值。shell腳本中的返回值最好多1開始遞增。

示例程序:

復制代碼
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>#define EXIT_ERR(m) \
do\
{\perror(m);\exit(EXIT_FAILURE);\
}\
while (0);\int main(void)
{int status ;status = system("ls -l|wc -l");if(status == -1){EXIT_ERR("system error");}else{if(WIFEXITED(status)){if(WEXITSTATUS(status) == 0)printf("run command successful\n");elseprintf("run command fail and exit code is %d\n",WEXITSTATUS(status));}elseprintf("exit status = %d\n",WEXITSTATUS(status));}return 0;
}
復制代碼

結果:

QQ截圖20130713131149

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

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

相關文章

安裝了最新版本的java 用友nc打不開_NC無法安裝客戶端插件,不能進入用友NC系統登陸界面...

NC無法安裝客戶端插件&#xff0c;不能進入用友NC系統登陸界面問題現象現象1&#xff1a;可以打開web界面&#xff0c;但無法進入登陸界面&#xff0c;一直停留在右圖所示界面。現象2&#xff1a;系統提示安全警告問題原因在使用IE首次登錄NC系統時&#xff0c;系統會自動下載N…

漢王云名片識別(SM)組件開發詳解

大家好&#xff0c;最近在DeviceOne平臺上做了一個漢王云名片識別的功能組件。下面把我開發過程給大家做一個分享&#xff0c;希望可以幫助到大家。 下面我把我的思路給大家講解一下。1.找到我要集成的sdk&#xff0c;也就是漢王云名片的sdk下載&#xff08;android和ios&#…

[App Store Connect幫助]八、維護您的 App(4.2)查看評分與評論

您可以查看 App 的總評分或單個顧客評論。如有必要&#xff0c;您可以針對某條評論報告問題。 【注】顧客可以為您的 iOS 和 macOS App 評分并撰寫評論&#xff0c;但只能為 Apple TVOS App 評分。 必要職能&#xff1a;“帳戶持有人”職能、“管理”職能、“App 管理”職能、“…

visio studio json工具_《產品經理入門指南》彩蛋2:別技淫原型圖!你的Visio和Balsamiq Mockup入門了嗎?...

溫馨提示&#xff1a;如果你有關于產品經理方面的任何問題&#xff0c;歡迎關注我的微信公眾號與我互動。最新的免費系統的產品經理課程《老司機帶你做產品》已經推出&#xff0c;請關注微信公眾號&#xff1a;iamliuwenzhi很多產品新人剛開始工作時&#xff0c;喜歡一拿到需求…

漸進式web應用程序_通過漸進式Web應用程序吸引用戶并增強他們的體驗

漸進式web應用程序by Dave Gray戴夫格雷(Dave Gray) 通過漸進式Web應用程序吸引用戶并增強他們的體驗 (Engage your users and enhance their experience with Progressive Web Apps) 什么是漸進式Web應用程序&#xff1f; (What is a Progressive Web App?) A Progressive W…

mysql牽引例子_MySQL學習06(事務和索引)

事務概述什么是事務事務就是將一組SQL語句放在同一批次內去執行如果一個SQL語句出錯,則該批次內的所有SQL都將被取消執行MySQL事務處理只支持InnoDB和BDB數據表類型事務的ACID原則原子性(Atomic)整個事務中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#…

android操作系統 真的嗎_旋挖機培訓學校真的能學會嗎,旋挖鉆機到底有哪些操作系統...

旋挖機培訓學校真的能學會嗎添加微&#xff1a;yywyyc 旋挖鉆機到底有哪些操作系統【前言】很多使用旋挖鉆機或者想要了解旋挖鉆機的工程公司可能不是特別了解旋挖鉆機本身的系統以及部件&#xff0c;本篇文章針對旋挖鉆機的操作系統來給大家介紹一下&#xff0c;讓大家了…

WebAPI 2參數綁定方法

簡單類型參數 Example 1: Sending a simple parameter in the Url [RoutePrefix("api/values")] public class ValuesController : ApiController {// http://localhost:49407/api/values/example1?id2[Route("example1")][HttpGet]public string Get(int…

推薦幾個自己經常去的一些博客和網站

唐巧的技術博客objc中國Ray WenderlichCocoaDocs.orgNSHipsterLukes HomepageCocoabit | 做自己喜歡的事情轉載于:https://www.cnblogs.com/faceup/p/10423259.html

創建hugo博客_Hugo + Firebase:如何在幾分鐘內免費創建自己的靜態網站

創建hugo博客by Aravind Putrevu通過Aravind Putrevu Hugo Firebase&#xff1a;如何在幾分鐘內免費創建自己的靜態網站 (Hugo Firebase: How to create your own static website for free in minutes) Ever thought of having your own website for putting up your projec…

探測與響應是各企業機構在2017年的首要安全事務

作者系&#xff1a;Gartner首席研究分析師 Sid Deshpande &Gartner研究總監 Lawrence Pingree 2017年&#xff0c;各個企業正在改變其安全支出戰略&#xff0c;從僅注重防御轉而更加關心探測和響應程度。2017年的全球信息安全支出預計將達到900億美元&#xff0c;相較2016年…

java怎么引入html文件路徑_如何在public_html中讀取文件但在域外?使用相對路徑...

我正在嘗試從我的(附加組件)域目錄之外的目錄中讀取文件 . 這是我的目錄結構&#xff1a;public_html /domain /file_read.phpfile_write.phpsensitive /file.dat雖然我能夠使用“../sensitive/file.dat”寫入敏感&#xff0c;但我無法使用相同的方法進行讀取 . 有什么想法嗎&a…

JS基本概念(3)

【5】操作符 &#xff08;1&#xff09;一元操作符&#xff1a;只能操作一個值的操作符 遞增、遞減操作符a --a 前置    a a-- 后置&#xff08;這四個操作符對任何值都適用&#xff0c;不能轉換成數字的轉換為NaN&#xff09; 一元加、一元減操作符&#xff0…

csv文件怎么轉成excel_Java讀寫excel,excel轉成json寫入磁盤文件

pom讀寫excel主要的dependency<dependency> <groupId>org.apache.poigroupId> <artifactId>poiartifactId> <version>3.16version> dependency> <dependency> <groupId>org.apache.poigroupId> …

如何用Ant Design Pro框架做項目省力

1、熟悉React所有語法&#xff0c;以及redux、redux-saga、dva、一類的庫的能力 2、靈活運用該框架提供的基礎UI組件&#xff0c;想方設法利用現有的UI組件進行組合&#xff0c;盡可能減少工作量 轉載于:https://www.cnblogs.com/ww01/p/10430553.html

通過在Chipotle用餐了解模板方法設計模式

by Sihui Huang黃思慧 通過在Chipotle用餐了解模板方法設計模式 (Understanding the Template Method design pattern by eating at Chipotle) Object-Oriented Design Patterns in Life— gain an intuitive understanding of OO design patterns by linking them with real-…

Coriant助力Aureon部署100Gbps光纖網絡

根據相關消息顯示&#xff0c;光傳輸設備廠商Coriant日前表示已經向網絡傳輸和業務通信服務供應商Aureon Technology提供了7100納米分組光傳輸平臺&#xff0c;幫助其進行100Gbps光纖網絡的拓展。 該服務供應商&#xff08;Aureon&#xff09;將利用該分組光傳輸系統&#xff0…

python class tynu()_Visual Studio Express | Teraz Visual Studio Community

Program Visual Studio 2019 jest teraz dost?pnyDostosowany instalatorTwrz aplikacje w technologiach WPF, WinForms, platformy uniwersaln? systemu Windows, Win32, Android, iOS i innych — wszystko to za pomoc? jednego ?rodowiska IDE zapewniaj?cego wszyst…

css樣式中如何設置中文字體?

代碼如下: .selector{font-family: SimHei,"微軟雅黑",sans-serif;} 注意&#xff1a;加上中文名“微軟雅黑”是為了兼容opera瀏覽器&#xff0c;中文字體名必須加上引號&#xff08;單引號雙引號都可以&#xff09;。 MicrosoftJhengHei為微軟正黑體&#xff0c;STH…

前端做CRM管理系統是做什么_代辦行業的CRM客戶關系管理系統應該是什么樣子的?...

隨著互聯網的深耕細化&#xff0c;很多企業也在不斷優化自己的辦公方式&#xff0c;以優化企業的辦公流程&#xff0c;提高企業的辦事效率。因此實現辦公自動化&#xff0c;或者說實現數字化辦公就需要逐漸提上日程。今天給大家講講可以幫助代辦行業實現辦公自動化的產品&#…