1. 程式人生 > >Linux下system與popen函式

Linux下system與popen函式

曾經的曾經,被system()函式折磨過,之所以這樣,是因為對system()函數了解不夠深入。只是簡單的知道用這個函式執行一個系統命令,這遠遠不夠,它的返回值、它所執行命令的返回值以及命令執行失敗原因如何定位,這才是重點。當初因為這個函式風險較多,故拋棄不用,改用其他的方法。這裡先不說我用了什麼方法,這裡必須要搞懂system()函式,因為還是有很多人用了system()函式,有時你不得不面對它。 先來看一下system()函式的簡單介紹:
1 #include <stdlib.h>
2 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()函式的實現:
01 int system(const char * cmdstring)
02 {
03 pid_t pid;
04 int status;
05
06 if(cmdstring == NULL)
07 {
08 return (1); //如果cmdstring為空,返回非零值,一般為1
09 }
10
11

相關推薦

Linuxsystempopen函式

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

systempopen函式的效率

 我們在程式中希望執行shell命令的時候首先想到的system函式,這個函式很簡單,但有一個嚴重的問題,就是他的執行方式,效率上可能不高。         system函式首先建立一個新的程序,然後在新的程序中執行exec函式去執行我們的shell命令,然後阻塞等待shel

對於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-

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

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

Linux隨機數生成的函式常見方法

rand函式:    標頭檔案        #include<stdlib.h>    定義函式        int rand(void)    函式說明        rand()會返回一隨機數值,範圍在0至RAND_MAX 間。在呼叫此函式產生隨機數前,

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

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

linuxsystem函式錯誤返回-1 錯誤原因NO child processes

呼叫system函式執行一個shell命令,返回-1,錯誤提示no child processes 但system可以執行成功 原因是呼叫system之前有放置忽略SIGCHLD的語句 signal(SIGCHLD, SIG_IGN); 如果SIGCHLD訊號行為被

關於linuxsystem()函數的總結

min ons 了解 shell 等我 exe urn per pro 先來看一下system()函數的簡單介紹: #include int system(const char *command) system()函數調用/bin/sh來執行參數指定的命令,/bin/sh

Intellij idea史上最簡單的教程之Linux安裝破解Intellij idea2017

成功 zxvf java 新建 pre form 旗艦版 lan intel 一、前言 這一節我們介紹在Linux下如何安裝與破解Intellij idea2017。現在有很多公司開發環境都是Linux,所以掌握在Linux環境下使用Idea辦公也是咱們必須得掌握的技能。

Linux安裝配置Nginx

下載 訪問 準備 cep ssi config configure 你會 inpu 一、準備 Nginx版本:nginx-1.7.7.tar.gz 請自行到官網下載對應的版本。 二、步驟 ?在Linux新建一個queenLove用戶 [[email prot

linux打包壓縮

包名 大小 方便 文件 nbsp 視頻 查看 more 文本文 歸檔   文檔很多,很亂, 方便使用、查閱、閱讀 已於管理(批量刪除文件) 壓縮 a.txt /etc/passwd 文本文件壓縮後很省空間 aaa.jpeg 壓縮

linuxlastlastb命令詳解

bubuko 使用 文件的 clas ip地址 tty 遠程 默認 讀取 在linux系統中,last與lastb命令用來列出目前與過去登錄系統的用戶相關信息。指令英文原義: last, lastb - show listing of last logged in user

linux目錄文件的查找

crypt only map 是個 工作 roo splay strong 過程 參考網址:http://www.runoob.com/linux/linux-command-manual.html which命令: which命令用於查找並顯示給定命令的絕對路徑,環境

Linuxlscp命令

col src 註意 nbsp 技術 span 分享 應用 bubuko     Linux熟練的應用命令,才可以隨心所欲~ ls 註意:   ls -1 //每次只列出1個文件 cp 註意:   cp -u xxx xxx //註意修改時間的先

linux安裝配置Redis

修改 密碼 ted 路徑 設置密碼 fix 安裝與配置 安裝 bsp 1.安裝 (1)獲取源代碼   wget http://download.redis.io/releases/redis-4.0.8.tar.gz (2)解壓   tar xzvf redis-4.0.8

LinuxApachetomcat的整合

一.jdk安裝 1.在www.sun.com中下載linu的jdk1.6,下載到/home/lijing/下 2.在當前目錄下,輸入sh jdk-6u2-linux-i586-rpm.bin   看到 安裝程式在詢問您是否尊守許可協議頁面 ,回車,空格都可以,看完協議. &

Linux壓縮解壓

zip壓縮解壓 壓縮: zip -r dist.zip dist/* 解壓: unzip dist.zip unzip -o dist.zip // 在不提示的情況下覆蓋檔案 unzip -o -d ~/Desktop/temp // -d指定解壓目錄 tar壓縮解壓

Linux的C語言函式perror

perror的函式原型為`void perror(const char *s)` 這個函式會先輸出你傳給他的實參 s 所指的字串,後面再加上錯誤原因字串。此錯誤原因依照全域性變數errno 的值來決定要輸出的字串。 在庫函式中有個errno變數,每個errno值對應著以字串表示的錯誤型別。當