Linux system 函數(shù)

最近工作中在Linux下,某些指定的程序需要調(diào)用指定的shell腳本完成指定工作,以前也曾經(jīng)做過類似的功能,調(diào)用system函數(shù)執(zhí)行指定的腳本,以前并不關(guān)心shell腳本是否執(zhí)行成功了,現(xiàn)在的功能需要根據(jù)shell腳本執(zhí)行成功與否,于是查詢了下system函數(shù)的說明,有此文以做筆記之用卓囚。

system 函數(shù)說明

#include <stdlib.h>

int system(const char *command);

功能:調(diào)用/bin/sh -c 執(zhí)行指定的腳本 command

常規(guī)使用方法:

int ret = system("./test.sh");

關(guān)于返回值:

  • system 返回值,調(diào)用函數(shù)后的返回值
  • shell 返回值,指腳本執(zhí)行后的返回值

如何判斷腳本是否執(zhí)行成功

  • ret == 0
  • ret != -1
    以上兩個(gè)對(duì)于返回值的判定削茁,是經(jīng)常被使用的,但是正確么私爷。街氢。。

答案是都錯(cuò)

system 返回值說明

man手冊(cè)

The value returned is -1 on error (e.g. fork() 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.

看著挺暈的,但是如果對(duì)于system的執(zhí)行過程了解的話,就很容易理解了,函數(shù)執(zhí)行分為以下幾個(gè)階段。
階段1:創(chuàng)建子進(jìn)程等準(zhǔn)備工作写妥。如果失敗,返回-1
階段2:調(diào)用/bin/sh拉起腳本,如果拉起失敗或者shell未正常執(zhí)行,原因值被寫入ret中
階段3:如果shell腳本執(zhí)行成功,shell腳本的返回值寫入ret中

從上面可知,不管shell腳本返回什么值,只要調(diào)用了/bin/sh,并且執(zhí)行過程沒有被信號(hào)中斷,都算正常結(jié)束劲弦。因?yàn)槟_本是在子進(jìn)程中執(zhí)行的,所以要想獲取腳本是否執(zhí)行成功的方法只能用系統(tǒng)提供的兩個(gè)宏。

WIFEXITED用來判斷階段二的返回值
WEXITSTATUS用來判斷階段三的返回值

由于我們一般在shell中會(huì)通過返回值判斷腳本是否執(zhí)行成功醇坝,成功返回0邑跪,成功返回整數(shù)。所以判斷一個(gè)腳本是否執(zhí)行成功,應(yīng)該滿足三個(gè)條件:

  • -1 != ret
  • WIFEXITED(ret)為真
  • 0 == WEXITSTATUS(ret)

注意:當(dāng)shell腳本不存在時(shí)呼猪、沒有執(zhí)行條件等,前兩個(gè)條件也會(huì)成立,此時(shí)WEXITSTATUS(ret)為127,所以shell腳本中不能將127作為返回值,shell腳本中的異常返回值最好從1開始遞增,成功返回0画畅。

實(shí)例代碼

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/wait.h>


int main(int argc, char *argv[])
{

    pid_t status;


    status = system("./test.sh");

    if (-1 == status)
    {
        printf("system error!");
    }
    else
    {
        printf("exit status value = [0x%x]\n", status);

        if (WIFEXITED(status))
        {
            if (0 == WEXITSTATUS(status))
            {
                printf("run shell script successfully.\n");
            }
            else
            {
                printf("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));
            }
        }
        else
        {
            printf("exit status = [%d]\n", WEXITSTATUS(status));
        }
     }
     return 0;
}

總結(jié)

system用起來,看則簡(jiǎn)單,實(shí)則不那么簡(jiǎn)單,有很多隱藏的坑,需要自己深入理解原理,才能更好地使用,也可以用其他實(shí)現(xiàn)方式完成相同的功能宋距。
最后對(duì)自己說,多寫,多思,多總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子句占,更是在濱河造成了極大的恐慌,老刑警劉巖诱篷,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異雳灵,居然都是意外死亡棕所,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門悯辙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琳省,“玉大人,你說我怎么就攤上這事躲撰≌氡幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵拢蛋,是天一觀的道長(zhǎng)桦他。 經(jīng)常有香客問我,道長(zhǎng)瓤狐,這世上最難降的妖魔是什么瞬铸? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮础锐,結(jié)果婚禮上嗓节,老公的妹妹穿的比我還像新娘。我一直安慰自己皆警,他們只是感情好拦宣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著信姓,像睡著了一般鸵隧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上意推,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天豆瘫,我揣著相機(jī)與錄音,去河邊找鬼菊值。 笑死外驱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腻窒。 我是一名探鬼主播昵宇,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼儿子!你這毒婦竟也來了瓦哎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒋譬,沒想到半個(gè)月后割岛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羡铲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蜂桶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片也切。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扑媚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雷恃,到底是詐尸還是另有隱情疆股,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布倒槐,位于F島的核電站旬痹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏讨越。R本人自食惡果不足惜两残,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望把跨。 院中可真熱鬧人弓,春花似錦、人聲如沸着逐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耸别。三九已至健芭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秀姐,已是汗流浹背慈迈。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留省有,地道東北人痒留。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锥咸,于是被迫代替她去往敵國(guó)和親狭瞎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子细移,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理搏予,服務(wù)發(fā)現(xiàn),斷路器弧轧,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 一雪侥、Nagios簡(jiǎn)介 Nagios是一款開源的電腦系統(tǒng)和網(wǎng)絡(luò)監(jiān)視工具碗殷,能有效監(jiān)控Windows、Linux和Uni...
    1b3bd36d9d21閱讀 8,140評(píng)論 3 13
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 為何叫做 shell 速缨? shell prompt(PS1) 與 Carriage Return(CR) 的關(guān)系锌妻?...
    Zero___閱讀 3,139評(píng)論 3 49
  • 著裝對(duì)一個(gè)人非常重要仿粹,我曾經(jīng)不以為然,直到工作后才發(fā)現(xiàn)穿什么衣服真的很重要原茅。 重要到別人可以通過你的著裝來預(yù)測(cè)你的...
    一朵花的理想國(guó)閱讀 213評(píng)論 0 5