天天看點

讓你提前認識軟體開發(23):如何在C語言中執行shell指令?

第1部分 重新認識C語言

如何在C語言中執行shell指令?

【文章摘要】

         Linux作業系統具備開源等諸多優秀特性,是以在許多通信類軟體(主流開發語言為C語言)中,開發平台都遷移到了Linux上,同時shell操作在Linux的程式設計中占有很重要的地位,這就需要開發人員熟練掌握在C語言中執行shell指令的相關操作。

        本文用實際的代碼示範了如何在C語言程式中執行shell指令,為相關軟體開發工作的開展提供了參考。

【關鍵詞】

         Linux  C語言  shell  指令  開發

一、程式執行流程

         本文在Linux下執行一個簡單的檔案删除操作,C程式用makefile檔案進行編譯。程式執行流程如圖1所示。

讓你提前認識軟體開發(23):如何在C語言中執行shell指令?

圖1 程式執行流程

        檔案删除是否成功,可以通過檢視對應目錄下的檔案是否存在來判斷。

二、目錄結構

        本文的C程式檔案為TestShellCommand.c,編譯生成的檔案存放到release目錄下。同時,在release目錄下有一個TestFile目錄,存放待删除的檔案。目錄結構如圖2所示。

讓你提前認識軟體開發(23):如何在C語言中執行shell指令?
讓你提前認識軟體開發(23):如何在C語言中執行shell指令?

圖2 目錄結構

三、C程式代碼

        本文中要用到的C程式代碼如下:

/**********************************************************************

* 版權所有 (C)2014, Zhou Zhaoxiong。

*

* 檔案名稱: TestShellCommand.c

* 檔案辨別:無

* 内容摘要:測試在C語言中執行shell指令

* 其它說明:無

* 目前版本: V1.0

* 作    者: Zhou Zhaoxiong

* 完成日期: 20140521

* 修改記錄1:// 修改曆史記錄, 包括修改日期、版本号、修改人及修改内容

* 修改日期: 20140521

* 版本号: V1.0

* 修改人: Zhou Zhaoxiong

* 修改内容:建立

**********************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

// 重新定義資料類型

typedef unsigned char  UINT8;

typedef          int   INT32;

typedef unsigned int   UINT32;

* 功能描述:主函數

* 輸入參數:無

* 輸出參數:無

* 傳回值: 0-執行成功   其它-執行失敗

* 修改日期        版本号     修改人            修改内容

* -------------------------------------------------------------------------------------------------------

* 20140521        V1.0     Zhou Zhaoxiong        建立

***********************************************************************/

INT32 main()

{

    UINT8  szFileIndex[100]            = {0};      // 用于存放檔案索引

    UINT8  szFileDirectory[100]      = {0};      // 用于存放檔案路徑,

    UINT8  szDeleteCommand[100] = {0};      // 用于存放删除檔案指令

    UINT8 *pIndexExt                     = NULL;  // 用于判斷szFileIndex字段是否有字尾

    UINT32 iRetVal                        = 0;        // 表示調用system後的傳回值

    printf("Input the index of source file: ");

    scanf("%s", szFileIndex);         // 讀入檔案索引, 分為帶字尾和不帶字尾兩種

    strncpy(szFileDirectory, "TestFile", strlen("TestFile"));   // 将檔案存放路徑放到szFileDirectory中

    pIndexExt = strrchr(szFileIndex, '.');

    if (pIndexExt == NULL)        // 對無字尾的情況進行處理

    {

        snprintf(szDeleteCommand, sizeof(szDeleteCommand) - 1, "rm -rf %s/%s.*", szFileDirectory, szFileIndex);

    }

    else                         // 對有字尾的情況進行處理

        snprintf(szDeleteCommand, sizeof(szDeleteCommand) - 1, "rm -rf %s/%s", szFileDirectory, szFileIndex);

    printf("The delete command is: %s\n", szDeleteCommand);   // 列印删除指令

    iRetVal = system(szDeleteCommand);        // 調用system執行删除指令

    if (-1 == iRetVal)                         // 對指令執行失敗的情況要列印日志

        if (errno != 0 && errno != 10)

        {

            printf("Exec %s failed!\n", szDeleteCommand);

             return -1;

        }

    return 0;                  // main函數正常傳回0

}

        對于該程式,說明如下:

        (1) 本程式利用“rm-rf …”指令來删除檔案,該指令不僅可以删除檔案,也可以删除非空目錄(-rf參數表示遞歸強制删除)。當然,這裡也可以直接用“rm …”指令來删除檔案。“rm -rf %s/%s.*”中的“*”表示比對所有的字元,即隻要檔案索引與輸入的一緻,不管字尾是什麼,都會被删除掉。

        (2) 本程式利用“system”函數來執行删除檔案的shell指令,該函數的原型為“int system(const char * string);”。“system”函數執行完成之後會傳回一些整型值,表示成功或失敗。程式中用檢查errno的方法來确認執行是否成功,如程式中errno為0和10表示執行成功。此外,要注意包含頭檔案<errno.h>。

        (3) 本程式用strrchr函數查找輸入的檔案索引裡面是否包含了“.”,即判斷是否輸入了檔案的字尾,根據有無字尾來設定不同的删除指令。

四、makefile檔案内容

        本程式所用的makefile檔案的内容如下:

TestShellCommand : TestShellCommand.c

       gcc -c -g TestShellCommand.c

       gcc -g -o release/TestShellCommand TestShellCommand.o

       rm *.o

        最後生成的TestShellCommand檔案存放在release目錄下,與TestFile目錄為同一級。

五、程式執行結果

        在TestFile目錄下存放一個檔案123456.r,執行“make”指令的結果如下:

zhou@linux:~/zhouzx/TestShellCommand> make

gcc -c -g TestShellCommand.c

gcc -g -o release/TestShellCommand TestShellCommand.o

rm *.o

        轉到“release”目錄下,運作TestShellCommand(有兩種運作方式:TestShellCommand和./TestShellCommand),結果如下:

zhou@linux:~/zhouzx/TestShellCommand/release> TestShellCommand

Input the index of source file: 123456

The delete command is: rm -rf TestFile/123456.*

Input the index of source file: 123456.r

The delete command is: rm -rf TestFile/123456.r

zhou@linux:~/zhouzx/TestShellCommand/release> ./TestShellCommand

        上面執行了四次TestShellCommand,123456.r檔案都被成功删除掉了。為了驗證程式的正确性,可以多用一些檔案來進行測試。

六、總結

       本文對C語言程式中執行shell指令的方法作了詳細的介紹,并用實際的程式代碼來示範了其執行結果。

       在C語言程式執行shell指令的過程中,我們要注意以下問題:

       (1) 一定要将shell指令配置正确,并在其執行前後列印詳細的日志,友善對程式進行調試和查錯。

       (2) 在進行删除操作的之前,還要仔細檢查shell指令的正确性,確定程式不會誤删除。

       在實際的軟體開發項目中,C語言程式運作于Linux之下已是十分常見。本文介紹了C語言程式中執行shell指令的過程,為相關軟體開發工作的順利開展提供了有益的參考。

繼續閱讀