1. 程式人生 > >【C/C++】Linux下使用system()函式一定要謹慎

【C/C++】Linux下使用system()函式一定要謹慎

文章來源: http://my.oschina.net/renhc/blog/53580 

曾經的曾經,被system()函式折磨過,之所以這樣,是因為對system()函數了解不夠深入。只是簡單的知道用這個函式執行一個系統命令,這遠遠不夠,它的返回值、它所執行命令的返回值以及命令執行失敗原因如何定位,這才是重點。當初因為這個函式風險較多,故拋棄不用,改用其他的方法。這裡先不說我用了什麼方法,這裡必須要搞懂system()函式,因為還是有很多人用了system()函式,有時你不得不面對它。 先來看一下system()函式的簡單介紹: ?
1 2 #include <stdlib.h> int system(const char *command);

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

system()函式呼叫/bin/sh來執行引數指定的命令,/bin/sh 一般是一個軟連線,指向某個具體的shell,比如bash,-c選項是告訴shell從字串command中讀取命令; 在該command執行期間,SIGCHLD是被阻塞的,好比在說:hi,核心,這會不要給我送SIGCHLD訊號,等我忙完再說; 在該command執行期間,SIGINT和SIGQUIT是被忽略的,意思是程序收到這兩個訊號後沒有任何動作。 再來看一下system()函式返回值: 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 nonzero if the shell is available, and zero if not. 為了更好的理解system()函式返回值,需要了解其執行過程,實際上system()函式執行了三步操作: 1.fork一個子程序; 2.在子程序中呼叫exec函式去執行command; 3.在父程序中呼叫wait去等待子程序結束。 對於fork失敗,system()函式返回-1。 如果exec執行成功,也即command順利執行完畢,則返回command通過exit或return返回的值。 (注意,command順利執行不代表執行成功,比如command:"rm debuglog.txt",不管檔案存不存在該command都順利執行了) 如果exec執行失敗,也即command沒有順利執行,比如被訊號中斷,或者command命令根本不存在,system()函式返回127. 如果command為NULL,則system()函式返回非0值,一般為1. 看一下system()函式的原始碼 看完這些,我想肯定有人對system()函式返回值還是不清楚,看原始碼最清楚,下面給出一個system()函式的實現: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 int system(const char * cmdstring) { pid_t pid; int status; if(cmdstring == NULL) { return (1); //如果cmdstring為空,返回非零值,一般為1 } if((pid = fork())<0) { status = -1; //fork失敗,返回-1 }

相關推薦

C/C++Linux使用system()函式一定謹慎

文章來源: http://my.oschina.net/renhc/blog/53580  曾經的曾經,被system()函式折磨過,之所以這樣,是因為對system()函數了解不夠深入。只是簡單的知道用這個函式執行一個系統命令,這遠遠不夠,它的返回值、它所

Linux使用system函式一定謹慎

曾經的曾經,被system()函式折磨過,之所以這樣,是因為對system()函數了解不夠深入。只是簡單的知道用這個函式執行一個系統命令,這遠遠不夠,它的返回值、它所執行命令的返回值以及命令執行失敗原因如何定位,這才是重點。當初因為這個函式風險較多,故拋棄不

Linux使用system()函式一定謹慎

曾經的曾經,被system()函式折磨過,之所以這樣,是因為對system()函數了解不夠深入。只是簡單的知道用這個函式執行一個系統命令,這遠遠不夠,它的返回值、它所執行命令的返回值以及命令執行失敗原因如何定位,這才是重點。當初因為這個函式風險較多,故拋棄不用,改用其他的

c語言實現linux高危函式system (簡易V1.0版本)

system這個函式真的是要慎用,一不小心就會留下漏洞。 下面是用c語言簡易的實現了一下system函式 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<err

c語言實現linux高危函式system (簡易V1.0版本)

system這個函式真的是要慎用,一不小心就會留下漏洞。 下面是用c語言簡易的實現了一下system函式 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #inc

修改密碼Linux修改Mysql的用戶(root)的密碼

exit 用戶 mysql use 操作 -- 原來 都沒有 註意 修改的用戶都以root為列。一、擁有原來的myql的root的密碼;方法一:在mysql系統外,使用mysqladmin# mysqladmin -u root -p password "test123"E

資料搬遷LINUX 安裝JDK

root用戶登錄 腳本語句 下載jdk 查詢 上傳 use 方法 path環境變量 自己 今天閑著沒事,就在linux下安裝一些應用軟件,學著裝那個JDK,和配置它的環境變量。雖然網上有很多的方法,自己做下也好,順帶記錄下,以便今後好查詢: 1,下載JDK 到sun的主頁

對於linuxsystem 函式的深度理解 整理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

對於linuxsystem()函式的深度理解(整理)

對於linux下system()函式的深度理解(整理)   (2013-02-07 08:58:54) 轉載▼ 標籤:  system()   popen()   sys

linuxsystem函式詳解

一、system函式的簡單介紹 標頭檔案 #include <stdlib.h> 函式定義 int system(const char * string); 函式說明 system()會呼叫fork()產生子程序,由子程序來呼叫/bin/sh-

必學Linux 三劍客的技能,你敢不學?

awk是一種用於處理文字、模式匹配的程式語言。與sed和grep,俗稱Linux下的三劍客。學會 awk 等於你在 Linux 命令列裡,又多了一種處理文字的選擇。這篇文章重點教你如何使用,看完這篇文章,就大致知道如何使用了,力求簡單使用。   術語鋪墊   在awk的文字處理規則

Nagios運維LinuxNagios的安裝與配置

一、Nagios簡介   Nagios是一款開源的電腦系統和網路監視工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網路設定,印表機等。在系統或服務狀態異常時發出郵件或簡訊報警第一時間通知網站運維人員,在狀態恢復後發出正常的郵件或簡訊通知。

對於linuxsystem()函式的深度理解

這幾天調程式(嵌入式linux),發現程式有時就莫名其妙的死掉,每次都定位在程式中不同的system()函式,直接在shell下輸入system()函式中呼叫的命令也都一切正常.就沒理這個bug,以為是其他的程式碼影響到這個,或是核心驅動檔案系統什麼的異常導致,昨天有出現了

Lua系列linuxlua的安裝

(原2012年5月4日文章,部落格解封后重新發出)工作需要lua,故記載linux下lua安裝步驟,方便自己和後來者查用。(注:作者本人使用ubuntu11.04)具體步驟如下:(2)快捷鍵ctrl+F2,輸入gnome-terminal,開啟終端;(3)安裝ubuntu的C

Oracle 叢集LinuxOracle RAC叢集搭建之Oracle DataBase安裝(八)

  以oracle使用者身份登入RAC1主節點,對解壓後的檔案安裝。(只需要主節點進行配置即可,子節點通過ssh通訊,自動配置) ./runInstaller 不選擇複選框security updates checkbox,下一步.  

Oracle 叢集LinuxOracle RAC叢集搭建之基本測試與使用(九)

概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先對這篇文章整體構思和形成進行梳理。

[轉]已解決Linux出現Segmentation Fault(core dump)錯誤

最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的

Web前端LinuxSublime Text3的一些配置

前言 最近在折騰linux,在這裡對sublime text做一些記錄。 keybinding [ { "keys": ["ctrl+alt+j"], "command": "css_format",

已解決Linux出現Segmentation Fault(core dump)錯誤

今天被這個問題搞了半個小時,後來通過新增printf(...)語句的方法找到了錯誤原因,是因為在程式中錯誤的輸出一個為空的字串導致。。。 1. 段錯誤是什麼 一句話來說,段錯誤是指訪問的記憶體超出了系統給這個程式所設定的記憶體空間,例如訪問了不存在的記憶體地址、訪

對於linuxsystem()函式的深度理解(轉載)

轉載自 http://blog.sina.com.cn/s/blog_8043547601017qk0.html 這幾天調程式(嵌入式linux),發現程式有時就莫名其妙的死掉,每次都定位在程式中不同的system()函式,直接在shell下輸入syste