C C C與Shell的如何互傳資訊

2021-08-31 04:01:27 字數 2042 閱讀 2346

一、引子

在很多時候,我們期望c程式與shell能夠互傳資訊。比如:我們需要用shell來控制c程式的執行,並且希望c程式能從shell中獲取相關資訊;同樣,我們也需要從c程式中返回一些資訊給shell,以便shell根據返回資訊執行下一步操作。

二、shell傳遞資訊給c程式

熟悉linux下c程式設計的人都知道,c語言中"main"函式有與shell命令的介面:

int main(int argc, char **argv)

其中,"argc"(argument counts)表示傳入引數的個數,"argv"(argumen values)表示傳入引數的值。

來看下面一段**:

#include int main(int argc, char **argv)

./exchange_msg_shell hello world
其輸出如下:

argc = 3

argv0 = ./exchange_msg_shell

argv1 = hello

argv2 = world

引數"argc"儲存了傳入引數的個數,引數"argv"以陣列的形式儲存了傳入引數的值,並且第乙個值"argv[0]"表示該可執行檔案的檔名,"argv[1], argv[2]"依次表示後面緊跟的引數值。

需要進一步說明的是,引數以字串的形式進行傳遞,即使傳遞是數值型別(整形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 當重複 不在同一物件中時,那就運用抽取類的手段將重複的部分抽取到...