程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 提前認識軟件開發(23) 如何在C語言中執行shell命令

提前認識軟件開發(23) 如何在C語言中執行shell命令

編輯:關於C語言

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

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

一、程序執行流程

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

圖1 程序執行流程

文件刪除是否成功,可以通過查看對應目錄下的文件是否存在來判斷。

二、目錄結構

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

圖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.*

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

Input the index of source file: 123456.r

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

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

Input the index of source file: 123456

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

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

Input the index of source file: 123456.r

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

上面執行了四次TestShellCommand,123456.r文件都被成功刪除掉了。為了驗證程序的正確性,可以多用一些文件來進行測試。

六、總結

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

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

(1) 一定要將shell命令配置正確,並在其執行前後打印詳細的日志,方便對程序進行調試和查錯。

(2) 在進行刪除操作的之前,還要仔細檢查shell命令的正確性,確保程序不會誤刪除。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved