2012-07-03 63 views
2

K&R book存在如下問題:的C調用程序殼

編寫大寫轉換降低,反之亦然,這取決於它被調用,有名稱的程序?

在給出的解決方案,它說,當程序名爲lower調用,程序轉換lowerupper。在解決方案argv[0]"lower"進行比較,但在Linux argv[0]將是"./lower"而不是"lower"

有人可以澄清嗎?

+0

然後使用'argv [1]'。有什麼問題? – Linuxios

+2

我認爲在他們的情況下,他們不使用./,因爲他們將shell設置爲使用當前目錄作爲使用可執行文件時的相對路徑。這與僅輸入ls而不是/ usr/bin/ls的想法類似。在你的情況下,./指定你想在當前目錄中使用lower。 「」意味着* nix系統中的當前工作目錄。 – squiguy

+0

什麼是K&R書? – uday

回答

3

考慮這個測試代碼:

#include <stdio.h> 
int main(int argc, char** argv) { 
    printf("ARGV[0] = %s\n", argv[0]); 
} 

如果我編譯它爲「test_argv」,並運行它,我得到什麼我鍵入運行程序:

% ./test_argv 
ARGV[0] = ./test_argv 
% test_argv 
ARGV[0] = test_argv 
% /tmp/test_argv 
ARGV[0] = /tmp/test_argv 

所以你要例如,針對正則表達式或子字符串測試字符串。

+0

但我試過的第二個選項沒有在linux中運行代碼.. – Dhatri

+0

它需要./才能運行可執行文件嗎? – Dhatri

+1

如果您將可執行文件放置在〜/ bin /或路徑中的其他位置,它將運行可執行文件。 –

3

Shell如何執行程序? (下面很簡單說明)

shell() 
{ 
    loader("Path name/Filename of your program", argv[0], argv[1]...for your program); 
} 

這意味着所有的這些參數來加載器,由所述外殼製成,然後將 裝載機被調用,並且默認的argv [0]是由相同的路徑名/程序的文件名。

現在,當你說./a.out ..它意味着你的程序的絕對路徑名是在當前目錄./a.out.(The文件爲a.out)

我們可以省略./ ?答案是肯定的,如果環境變量PATH有。作爲其組成部分之一說的第一個組成部分。

通過在shell提示符下鍵入echo $ PATH可以看到PATH變量的內容(A:可以看到分隔的路徑列表)。

如果。是不是你可以通過在shell提示符下輸入export PATH =。:$ PATH來添加。

之後,您可以通過鍵入a.out從當前目錄運行您的代碼,而不必鍵入./a.out。

現在我認爲這很清楚,爲什麼argv [0]成爲您正在執行的文件的名稱?

現在我們可以爲argv [0]命名,而不是文件名

答案是肯定的,然後你需要自己調用加載程序,那就是寫一小段像shell一樣的代碼。

您可以瀏覽互聯網/手冊頁execve功能家族,這實際上是這裏所說的加載程序。