一、引子
在很多時候,我們期望c程式與shell能夠互傳資訊。比如:我們需要用shell來控制c程式的執行,並且希望c程式能從shell中獲取相關資訊;同樣,我們也需要從c程式中返回一些資訊給shell,以便shell根據返回資訊執行下一步操作。
二、shell傳遞資訊給c程式
熟悉linux下c程式設計的人都知道,c語言中"main"函式有與shell命令的介面:
其中,"argc"(argument counts)表示傳入引數的個數,"argv"(argumen values)表示傳入引數的值。int main(int argc, char **argv)
來看下面一段**:
#include int main(int argc, char **argv)
./exchange_msg_shell hello world
其輸出如下:
引數"argc"儲存了傳入引數的個數,引數"argv"以陣列的形式儲存了傳入引數的值,並且第乙個值"argv[0]"表示該可執行檔案的檔名,"argv[1], argv[2]"依次表示後面緊跟的引數值。argc = 3
argv0 = ./exchange_msg_shell
argv1 = hello
argv2 = world
需要進一步說明的是,引數以字串的形式進行傳遞,即使傳遞是數值型別(整形int,浮點型float等等),因為陣列「argv」的型別是"char"。那麼,如果我們要從shell接收數值型別的輸入該怎麼辦呢?我們可以先從shell接收字元型別的輸入,然後在c程式內部,使用型別轉換,將字元型別轉換為我們所需要的數值型別。c語言中將字串轉換為整數的函式是"atoi"(ascii to integer),將字串轉化為浮點數的函式是"atof"(ascii to floating point numbers),它們均包含在標頭檔案"#include"中,接收乙個字串作為輸入引數,輸出引數為"int"或"float"型別的數。
三、c程式傳遞資訊給shell
c程式執行總會有個返回值,一般而言,如果順利執行結束,最後main函式會返回乙個值"0";而一旦執行過程中報錯,c程式會返回乙個非0值。(返回值因程式設計編寫的不同而不同,一般而言返回值為0代表順利執行結束;而返回值為非0值表示執行過程中出錯)
其實,用shell命令執行c程式時,該c程式和普通的shell命令如出一轍。執行shell命令時,執行成功,會返回乙個值0;執行失敗,會返回乙個非0值。並且,shell中有乙個系統環境變數"$?"來儲存上次執行命令的返回值的。這樣,我們就可以在執行完c程式後,通過系統環境變數"$?"來判斷c程式是否順利執行了。比如,在當前目錄下有乙個資料夾「./test1」,我們可以使用命令"cd"切換到資料夾"./test1":
cd test1/
這個操作是成功的,命令列沒有返回任何資訊(按照unix的哲學:「沒有訊息就是好訊息」),但其實系統用變數"$?"來記錄了該命令的返回值(也稱為命令的退出狀態),我們可以顯示出"$?"的值:
echo $?
其輸出為"0",說明該命令執行成功。我們再試圖用命令"cd"切換到乙個當前資料夾中不存在的資料夾"./test2":
cd test2/
終端會列印一條錯誤資訊:
bash : cd : test2/: no such file or directory
來告訴我們當前資料夾下不存在"test2/"資料夾。這時我們再來看變數"$?"值,發現是乙個非零值。
我們自己通過源**編譯鏈結所形成的可執行檔案,和普通的shell命令沒本質的區別,shell也會通過變數"$?"來記錄執行其返回值。但這種通過系統環境變數"$?"來傳遞資訊的方式,傳遞的資訊量太少了,只能知道c程式執行成功與否。如果我們期望在shell中獲得更多關於c程式的資訊,就必須得在c程式中有相應的輸出儲存到相關檔案中(比如:c程式執行的日誌檔案),然後用shell從該檔案中讀取資訊,進行下一步處理。
Python與shell命令互傳
參考 usr bin python coding utf 8 time 2017年5月23日17 01 38 author zmy intention 根據某個集市直接獲取需要遷移的清單 import os import time sum line 0 if name main 獲取該mart cm...
java實現客戶端與服務端互傳資訊聊天(帶介面)
public class getdate 服務端與客戶端為了可以調節接受資訊框裡的字型,所以使用的jtextpane。輸入框使用的jtextarea。接下來是服務端 public class server extends jframe catch badlocationexception e pri...
繼承與介面的如何合理設計
合理的框架設計,能提高 利用率,增加框架層間的耦合性,加大開發人員的效率。如何使用繼承extends和implement實現呢,以下幾點注意事項 1 當重複 存在於同一物件中時,該 多次呼叫或者重複出現,我們可以把這段 抽取為方法。2 當重複 不在同一物件中時,那就運用抽取類的手段將重複的部分抽取到...