1、命令就是程序我想絕大多數(shù)看這篇文章的讀者基本上都用過Windows操作系統(tǒng)下的命令提示符。
比起圖形化界面的操作,如果熟悉了Windows的命令提示符,你將會(huì)更快地操作這個(gè)操作系統(tǒng)。Windows圖形化界面如圖1所示。
圖1 Windows圖形化界面
不過,在Windows底下,大部分操作者還是習(xí)慣于圖形化界面的操作,因?yàn)樽鳛橐粋€(gè)商用化個(gè)人電腦操作系統(tǒng),Windows的圖形化界面做的非常流利,功能非常齊全。而如果你是一名服務(wù)器運(yùn)維人員,你的服務(wù)器操作系統(tǒng)是Linux,而且Linux主機(jī)位于云端,那么你在運(yùn)維的時(shí)候大概率會(huì)通過ssh工具遠(yuǎn)程登陸,展開日常的運(yùn)維工作。此時(shí),這種Linux下的終端命令操作,將會(huì)是你日常的操作,如圖2所示。
圖2 Linux下的終端界面
在操作Linux終端時(shí),我們會(huì)在終端里面輸入常用的命令,在Linux操作系統(tǒng)“一切皆文件”的設(shè)計(jì)哲學(xué)下,你日常輸入的這些命令,其實(shí)都是一個(gè)個(gè)“小程序”。然而,幾乎所有的操作系統(tǒng)都一樣,你想要操作一個(gè)命令,這個(gè)命令對(duì)應(yīng)的可執(zhí)行文件必須位于操作系統(tǒng)的環(huán)境變量中,在Linux操作系統(tǒng)下,這個(gè)環(huán)節(jié)變量的名稱叫做“PATH”,我們可以使用”echo $PATH”命令將環(huán)境變量打印出了,如圖3所示。
圖3 Linux下的環(huán)境變量
通過環(huán)境變量的打印,我們可以清楚的看到此Linux操作系統(tǒng)的環(huán)境變量路徑,只要可執(zhí)行文件或者鏈接(軟連接)文件位于這些文件目錄下,那么我們直接在終端里面輸入對(duì)應(yīng)的應(yīng)用程序名稱即可運(yùn)行?,F(xiàn)在,我們使用“cd /bin”命令打開根目錄下的“bin”文件夾,我們可以發(fā)現(xiàn)很多平時(shí)常用的命令,如“cp”,“chmod”等,如圖4所示。
圖4 /bin文件夾下的可執(zhí)行文件
2Linux下命令執(zhí)行的原理上述內(nèi)容,我們大致了解了Linux下操作命令終端運(yùn)行可執(zhí)行文件的原理,這些命令說到底都是應(yīng)用程序。但是大家是否想過,這些命令在運(yùn)行時(shí)后面可以跟上命令選項(xiàng),如“ls -l”可以列出當(dāng)前文件夾下所有文件的詳細(xì)信息,“ls -s”可以列出所有文件的大小。那么命令后面的參數(shù)是如何傳進(jìn)命令的應(yīng)用程序里面的呢?如圖5所示。
圖5 ls命令不同參數(shù)下的輸出
3C語言main函數(shù)的入口這些Linux命令程序大多都是采用C語言開發(fā)而成的,我們平時(shí)都知道,C語言整個(gè)程序的唯一入口就是“main”函數(shù),一般我們?cè)谧鲆恍┖?jiǎn)單程序的時(shí)候都是用“int main(void)”的形式來定義主函數(shù),而Linux下,一個(gè)C語言“main”函數(shù)的標(biāo)準(zhǔn)原型應(yīng)該是“int main(int argc, char *argv[], char *env[] );”,其中的三個(gè)參數(shù)分別是:int argc:傳入?yún)?shù)的數(shù)量;char *argv[]:傳入的參數(shù)列表;char *env[]:環(huán)境表地址。在ANSI C中,規(guī)定main函數(shù)只有兩個(gè)參數(shù),argc和argv,而且第三個(gè)參數(shù)與全局變量environ相比也沒有帶來更多益處,所以POSIX.1也規(guī)定應(yīng)使用environ而不使用第三個(gè)參數(shù)。通常用getenv和putenv函數(shù)來存取特定的環(huán)境變量,而不是用environ變量。所以我們見到的main函數(shù)的原型多是下面這種 形式:“int main ( int argc, char* argv[]);”。比如,我們假設(shè)在Linux下有一個(gè)“小程序”x,在我們使用x命令的時(shí)候,后面會(huì)有可變的參數(shù)a,b,c。一般我們使用這個(gè)x命令的時(shí)候,它的形式為“x ”,也就是說,x后面可以跟0個(gè),1個(gè),2個(gè),3個(gè)參數(shù),那當(dāng)這個(gè)命令執(zhí)行的時(shí)候,傳入x的main函數(shù)時(shí),“agrc”表示參數(shù)個(gè)數(shù),如當(dāng)用戶使用“./x a b”運(yùn)行這個(gè)程序時(shí),“agrc”為3,而這時(shí)候,*agrv[]這變成了長(zhǎng)度為3的字符串?dāng)?shù)組,其中agrv[0]=”./x”,agrv[1]=”a”, agrv[2]=”b”。按照這個(gè)思路,我們可以寫出如圖6所示的代碼。
圖6 x命令的實(shí)現(xiàn)
最后,我們只需要將x可執(zhí)行文件放到環(huán)境變量路徑中去,就可以在終端的任何地方運(yùn)行這個(gè)x命令了。由于x名稱太過簡(jiǎn)單,我們首先先將x改名成“xccmd”,再將其移入“/usr/sbin”文件夾中。接著,我們退到根目錄底下來運(yùn)行命令“xccmd a b c d e f”。如圖7所示。
圖7 將編譯結(jié)果添加到環(huán)境變量
以上就是Linux操作系統(tǒng)下添加自定義程序的方法,Windows下也適用,如果想實(shí)現(xiàn)具體的功能,只需要在代碼里面實(shí)現(xiàn)即可。
附 程序源碼
#include
int main(int argc, char* argv[])
{
int i;
printf("argc:%dn", argc);
for(i=0;i
{
printf("argv[%d]:%sn", i, argv[i]);
}
return 0;
}