色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > exec執(zhí)行普通文件和解釋器文件的區(qū)別

          exec執(zhí)行普通文件和解釋器文件的區(qū)別

          作者: 時間:2016-09-12 來源:網絡 收藏

          先解釋兩個概念;和解釋器。

          l :一種文本文件,開頭通常是:#! pathname [option-argument];比較常見的是#! /bin/bash,shell腳本和python腳本都屬于。

          l 解釋器:解釋器文件第一行中pathname指定的程序,如bash。

          3.1 解釋器文件的執(zhí)行

          當執(zhí)行()解釋器文件時,系統(tǒng)調用會識別這種文件,內核使調用函數的進程實際執(zhí)行的并不是該解釋器文件,而是pathname指定的解釋器。

          我們可以自己寫一個解釋器,如之前所寫的foo.c:

          l foo.c

          #include

          int

          main(int argc,char* argv[])

          {

          int i;

          for(i=0;i

          printf(argv[%d]: %sn,i,argv[i]);

          exit(0);

          }

          編譯成為foo然后保存在/mnt/hgfs/VWShared/。

          下面我們在自己寫一個”解釋器文件”——test:

          l test

          #!/mnt/hgfs/VWShared/foo

          3.1.1 通過命令行執(zhí)行解釋器文件

          直接在命令行中鍵入:”./test”,運行test,效果如圖5。

          圖5

          將test內容修改為:#!/mnt/hgfs/VWShared/foo argA argB,再次在命令行運行test,效果如圖6。

          圖6

          通過這兩個例子,可以看出命令行運行時當執(zhí)行文件是”解釋器文件”時,參數是如何傳遞給解釋器的:

          (1) 通過執(zhí)行”解釋器文件”執(zhí)行解釋器,傳遞給解釋器的第一個參數是解釋器文件的pathname,即解釋器的路徑。

          (2) “解釋器文件”中pathname后的可選參數(這里的argA,argB)如果存在的話會一起作為第二個參數傳遞給解釋器。

          (3) “解釋器文件”名稱會作為下一個參數傳遞給解釋器。

          3.1.2 通過execl執(zhí)行解釋器文件

          接下來通過execl執(zhí)行解釋器文件test,修改main中的exec語句如下:

          execl(/mnt/hgfs/VWShared/test,arg1,”arg2”,(char*)0));然后執(zhí)行main,效果如圖7。

          圖7

          從這個例子可以了解當執(zhí)行文件是解釋器文件時,內核如何處理exec函數的參數及解釋器文件第一行的可選參數。我們知道執(zhí)行解釋器文件實際是執(zhí)行解釋器,由解釋器去讀取解釋器文件中的語句執(zhí)行,而第一行的pathname以#開頭在執(zhí)行時會被當做注釋忽略。下面就讓我們分析一下最終傳入解釋器foo的參數都是什么。

          (1) argv[0]是該解釋器文件的pathname;

          (2) argv[1]是該解釋文件中的可選參數;

          (3) argv[2]是解釋器文件本身名字;

          (4) argv[3]是execl出入的第二個參數(第一個參數是arg1)。

          那么問題出現了,我們傳入execl的arg1去哪里了呢?其實這就是exec執(zhí)行”解釋器文件”和執(zhí)行一般程序的不同之處:在執(zhí)行一般程序時,execl(const char* pathname,const char* arg0,...,(char*)0)中的arg0會被當做執(zhí)行程序(pathname)的第一個參數argv[0],而在執(zhí)行解釋器文件時,內核取execl調用中的pathname而非第一個參數(arg0)作為第一個參數傳遞給解釋器,因為一般而言,第一個參數arg0通常是解釋器文件的名字,而pathname包含了比arg0更多的信息(解釋器文件的完整路徑)。所以當execl執(zhí)行解釋器文件時第一個參數arg0是無效的。

          為了說明這個問題,我們再舉一個例子,編寫python文件pyth.py如下:

          l pyth.py:

          #! /usr/bin/python

          import sys

          for i in range(0,len(sys.argv)):

          print argv[%d]: %s%(i,sys.argv[i])

          它的功能和foo一樣同樣是打印每個命令行參數。我們分別將main中的execl語句改為:

          execl(/mnt/hgfs/VWShared/foo,arg1,arg2,(char*)0))和

          execl(/mnt/hgfs/VWShared/pyth.py,arg1,arg2,(char*)0)),對比execl一般程序(foo)和解釋器文件(pyth.py)的效果如圖8、9。

          圖8.execl(/mnt/hgfs/VWShared/foo,arg1,arg2,(char*)0))結果

          圖9.execl(/mnt/hgfs/VWShared/pyth.py,arg1,arg2,(char*)0))結果

          可以看出execl對于執(zhí)行和解釋器文件選取第一個參數是不同的。

          3.2 execl執(zhí)行解釋器文件和命令行執(zhí)行解釋器文件的不同

          我們上面已經看到execl(/mnt/hgfs/VWShared/pyth.py,arg1,arg2,(char*)0))的結果(圖9),下面我們試一下命令行方式:pyth.py arg1 arg2,結果圖10:

          圖10

          可以看到結果和通過execl執(zhí)行是有區(qū)別的,通過命令行執(zhí)行解釋器文件就像通過命令行執(zhí)行普通程序一樣,程序名稱作為第一個參數,命令行后面依次作為后續(xù)參數。正因為對于解釋器文件的execl方式和命令行方式執(zhí)行時選取第一個參數的方式不同,所以對于解釋器文件a.py:



          評論


          技術專區(qū)

          關閉