亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

進程控制之解釋器文件

2024-06-28 13:28:33
字體:
來源:轉載
供稿:網友
進程控制之解釋器文件

所有現今的UNIX系統都支持解釋器文件(interPReter file)(也可稱為解釋器腳本)。這種文件是文本文件,其起始行格式是:

#! pathname [optional-argument]

感嘆號和pathname之間的空格是可選的。最常見的解釋器文件以下列行開始:

#!/bin/sh

pathname通常是絕對路徑名,對它不進行什么特殊的處理(即不使用PATH進行路徑搜索)。對這種文件的識別是由內核作為exec系統調用處理的一部分來完成的。內核調用exec函數的進程實際執行的并不是該解釋器文件,而是該解釋器文件第一行中pathname所指定的文件。一定要將解釋器文件(文本文件,它以#!開頭)和解釋器(由該解釋器文件第一行中的pathname指定)區分開來。(我們可以認為:解釋器文件就是在首行指定了其所使用的解釋器的文本文件。)

要知道很多系統對解釋器文件的第一行有長度限制。這些限制包括#!、pathname、可選參數、終止換行符以及空格數。在linux中支持該限制為127字節。

實例

讓我們觀察一個實例,從中可了解當被執行的文件是解釋器文件時,內核如何處理exec函數的參數及該解釋器文件第一行的可選參數。程序清單8-10調用exec執行一個解釋器文件。

程序清單8-10 執行一個解釋器文件的程序

[root@localhost apue]# cat prog8-10.c#include "apue.h"#include <sys/wait.h>intmain(void){        pid_t   pid;        if((pid = fork()) < 0)        {                err_sys("fork error");        }        else if(pid == 0)       /* child */        {                if(execl("/home/zhu/apue/testinterp",                        "testinterp", "myarg1", "MY ARG2", (char *)0) < 0)                        err_sys("execl error");        }        if(waitpid(pid, NULL, 0) < 0)   /* parent */                err_sys("waitpid error");        exit(0);}

程序清單8-10中被執行的解釋器文件內容如下(只有一行):

[root@localhost apue]# cat testinterp#!/home/zhu/apue/echoarg foo

程序echoarg(解釋器)回送每一個命令行參數(它就是程序清單7-3,參見:http://www.CUOXin.com/nufangrensheng/p/3507949.html)。

程序清單8-10運行結果:

[root@localhost apue]# ./prog8-10argv[0]: /home/zhu/apue/echoargargv[1]: fooargv[2]: /home/zhu/apue/testinterpargv[3]: myarg1argv[4]: MY ARG2

注意,當內核exec該解釋器(/home/zhu/apue/echoarg)時,argv[0]是該解釋器的pathname,argv[1]是解釋器文件中的可選參數,其余參數是pathname(/home/zhu/apue/testinterp),以及程序清單8-10中調用execl的第二個和第三個參數(myarg1和MY ARG2)。調用execl時的argv[1]和argv[2]已右移了兩個位置(?)。注意,內核取execl調用中的pathname而非第一個參數(testinterp),因為一般而言,pathname包含了比第一個參數更多的信息(通常第一個參數只是pathname的一部分)。

總的來說,當內核exec解釋器時,其命令行參數依次是該解釋器的pathname、解釋器的可選參數、解釋器文件的pathname、exec函數調用參數列表中argv[0]以后的參數(不包括argv[0],通常argv[0]只是解釋器文件pathname中的一部分)。(http://www.CUOXin.com/nufangrensheng/p/3510821.html中有提到我們可將argv[0]設置為任何字符串。

另外還有一篇關于解釋器和解釋器文件比較簡明扼要的一篇文章,可參考:http://www.CUOXin.com/beacer/archive/2012/09/16/2687659.html

實例

在解釋器pathname后可跟隨可選參數。如果一個解釋器程序支持-f選項,那么在pathname后經常使用的可選參數就是-f。

例如,可以以下列方式執行awk(1)程序:

awk -f myfile

它告訴awk從文件myfile中讀取awk程序。

如果在解釋器文件中使用-f選項,則可以寫成:

#!/bin/awk -f......

如果我們在myfile的第一行寫:#!/bin/awk -f,那么我們想要執行awk程序myfile時,不必再輸入命令awk –f myfile,而是直接輸入命令myfile即可。

例如,程序清單8-11為/usr/local/bin/awkexample這樣一個解釋器文件。

程序清單8-11 作為解釋器文件的awk程序

#!/bin/awk -fBEGIN {    for(i=0; i<ARGC; i++)        printf "ARGV[%d] = %s/n", i, ARGV[I]    exit}

如果路徑前綴之一是/usr/local/bin,則可以用下列方式執行程序清單8-11:

[root@localhost apue]# awkexample file1 FILENAME2 f3ARGV[0] = awkARGV[1] = file1ARGV[2] = FILENAME2ARGV[3] = f3

其實,shell會這樣調用exec:

exec("/usr/local/bin/awkexample",        "awkexample", "file1", "FILENAME2", "f3", NULL);

但是,實際上exec執行的是解釋器/bin/awk而不是解釋器文件awkexample,并且其命令行參數是:

/bin/awk -f /usr/local/bin/awkexample file1 FILENAME2 f3

是否一定需要解釋器文件呢?那也不完全如此。但是它們確實使用戶得到效率方面的好處,其代價是內核的額外開銷(因為識別解釋器文件的是內核)。

由于下述理由,解釋器文件是有用的:

(1)有些程序是用某種語言編寫的腳本,解釋器文件可將這一事實隱藏起來。例如,為了執行程序8-11,只需使用下列命令行:

awkexample opitonal-arguments

而并不需要知道該程序實際上是一個awk腳本,否則就需要以下列方式執行該程序:

awk -f awkexample optional-arguments

(2)解釋器腳本在效率方面也提供了好處。通常,用一個shell腳本代替解釋器腳本需要更多的開銷。

(3)解釋器腳本使我們可以使用除/bin/sh以外的其他shell來編寫shell腳本。(當execlp找到一個非機器可執行的可執行文件時(shell腳本是一個可執行文件,但卻不是機器可執行的),它總是調用/bin/sh來解釋執行該文件。)此時,我們只需要在解釋器腳本首行指明所用的shell即可。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
疯狂欧美牲乱大交777| 日韩精品视频在线免费观看| www高清在线视频日韩欧美| 久久久久国产视频| 国产精品网站大全| 91av在线播放| 国产精品福利在线| 欧美噜噜久久久xxx| 亚洲国产日韩精品在线| 亚洲最大av网| 日本精品视频在线| 国产精品444| 国产精品视频地址| 欧美视频免费在线| 色婷婷**av毛片一区| 高清欧美性猛交xxxx黑人猛交| 亚洲精品91美女久久久久久久| 91国产在线精品| 久久频这里精品99香蕉| 国产大片精品免费永久看nba| 国产亚洲综合久久| 一区二区三区四区在线观看视频| 欧美成人精品在线播放| 欧美日韩国产中文字幕| 午夜免费在线观看精品视频| 97热在线精品视频在线观看| 日韩风俗一区 二区| 91chinesevideo永久地址| 日本三级久久久| 成人综合网网址| 精品福利樱桃av导航| 北条麻妃99精品青青久久| 92国产精品久久久久首页| 97av在线视频免费播放| 久久久久久久一区二区三区| 欧美日韩在线看| 久久国产精品久久久久| 日韩精品极品视频| 国产精品免费网站| 久久久久久久久久婷婷| 这里只有精品久久| 亚洲人成电影在线观看天堂色| 久久国产精品影视| 在线观看成人黄色| 亚洲第一福利网| 在线观看视频亚洲| 久久久国产一区二区| 精品高清美女精品国产区| 日韩欧美在线视频免费观看| 亚洲欧洲高清在线| 午夜精品一区二区三区av| 欧美激情aaaa| 亚洲色在线视频| 26uuu亚洲伊人春色| 欧美视频裸体精品| 成人福利网站在线观看11| 91av在线精品| 亚洲人成网站在线播| 亚洲精品xxxx| 久久人人爽人人爽人人片av高请| 亚洲精品视频网上网址在线观看| 亚洲欧美国产日韩中文字幕| 性色av一区二区三区免费| 精品一区二区亚洲| 亚洲午夜激情免费视频| 久久久久久久一| 日韩在线中文视频| 欧美成人免费全部观看天天性色| 国产精品成av人在线视午夜片| 欧美亚洲国产另类| 成人激情综合网| 69视频在线免费观看| 精品久久久久久久久中文字幕| 欧美美女操人视频| 亚洲精品国产综合区久久久久久久| 色樱桃影院亚洲精品影院| 欧美日韩亚洲高清| 国产精品无码专区在线观看| 91亚洲精品在线| 亚洲伊人第一页| 国产一区视频在线| 久久久亚洲影院| 久久久精品久久久| 国产精品免费久久久久久| 欧美另类在线观看| 一区二区欧美久久| 98视频在线噜噜噜国产| 欧美怡红院视频一区二区三区| 国外成人性视频| 成人春色激情网| 97成人超碰免| 亚洲综合中文字幕在线| 亚洲精品久久久久国产| 久久精品在线播放| 91高清视频免费观看| 国产成人一区三区| 51视频国产精品一区二区| 欧美激情图片区| 91视频8mav| 日韩在线视频网| 欧美激情一级二级| 国产精品第一第二| 亚洲国产精品中文| 久久久久久这里只有精品| 欧美日韩国产色| 欧美精品成人91久久久久久久| 国产a级全部精品| 91a在线视频| 国产精品入口夜色视频大尺度| 97视频在线观看免费| 97色在线播放视频| 久久综合伊人77777尤物| 久久天天躁日日躁| 日韩欧美在线看| 亚洲性无码av在线| 日韩欧美黄色动漫| 国产精品成人一区| 热久久免费视频精品| 亚洲精品aⅴ中文字幕乱码| 久久影视电视剧免费网站清宫辞电视| 国产精品三级在线| 精品久久久999| 久久精品国产亚洲| 操日韩av在线电影| 日韩欧美一区二区三区| 精品国内自产拍在线观看| 国产亚洲美女精品久久久| 国产亚洲人成网站在线观看| 黑人狂躁日本妞一区二区三区| 国产suv精品一区二区三区88区| 91久久在线观看| 在线亚洲欧美视频| 精品成人69xx.xyz| 久久久亚洲精选| 日韩亚洲成人av在线| 国产又爽又黄的激情精品视频| 中文字幕精品一区久久久久| 亚洲一区二区少妇| 欧美猛交免费看| 国产aⅴ夜夜欢一区二区三区| 一区二区成人av| 亚洲丁香久久久| 国产亚洲人成a一在线v站| 欧美一区二区三区免费观看| 成人精品久久久| 欧洲亚洲免费在线| 中文字幕亚洲一区二区三区| 亚洲老板91色精品久久| 久久精品国产亚洲精品2020| 秋霞av国产精品一区| 欧美视频在线免费| 精品久久香蕉国产线看观看gif| 97免费视频在线播放| 欧美成人全部免费| 日韩欧美成人精品| 欧美精品免费在线观看| 欧美日韩性视频在线| 国产精品69精品一区二区三区| 久久精品视频va| 亚洲一区精品电影| 欧美激情视频一区二区| 欧美猛交ⅹxxx乱大交视频| 亚洲bt欧美bt日本bt| 91精品国产免费久久久久久|