你說(shuō)的是APUE上的很經(jīng)典的一個(gè)例子

創(chuàng)新互聯(lián)是專業(yè)的吉首網(wǎng)站建設(shè)公司,吉首接單;提供成都做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行吉首網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
源代碼如下:
#include stdio.h
#include stdlib.h
#include unistd.h
#define BUFFSIZE 4096
int main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) 0)
{
if (write(STDOUT_FILENO, buf, n) != n)
{
perror("write error");
exit(1);
}
}
if (n 0)
{
perror("read error");
exit(1);
}
exit(0);
}
較原來(lái)的作了少許改動(dòng),這種代碼應(yīng)該能讀懂吧。
把 main() 改寫成:
main(int argc,char *argv[])
其中,argc 是參數(shù)的個(gè)數(shù)+1,argv[0] 是命令名本身,argv[1] ...... argv[argc-1] 是命令后帶的各個(gè)參數(shù)構(gòu)成的字符串。 你使用自編程序作為命令時(shí),在命令名后跟的多參數(shù)是以空格分割的,如果某個(gè)參數(shù)本身就帶空格,必須用引號(hào)把它引起來(lái)。
在程序中訪問(wèn) argv[1] ...... argv[argc-1] 就可以訪問(wèn)到你下命令時(shí)輸入的各個(gè)參數(shù)。
-c :建立一個(gè)壓縮文件的參數(shù)指令(create 的意思)
首先介紹一個(gè)名詞“控制臺(tái)(console)”,它就是我們通常見(jiàn)到的使用字符操作界面的人機(jī)接口,例如dos。我們說(shuō)控制臺(tái)命令,就是指通過(guò)字符界面輸入的可以操作系統(tǒng)的命令,例如dos命令就是控制臺(tái)命令。
我們現(xiàn)在要了解的是基于Linux操作系統(tǒng)的基本控制臺(tái)命令。有一點(diǎn)一定要注意,和dos命令不同的是,Linux的命令(也包括文件名等等)對(duì)大小寫是敏感的,也就是說(shuō),如果你輸入的命令大小寫不對(duì)的話,系統(tǒng)是不會(huì)做出你期望的響應(yīng)的。
擴(kuò)展資料:
-x :解開(kāi)一個(gè)壓縮文件的參數(shù)指令!
-t :查看 tarfile 里面的文件!
特別注意,在參數(shù)的下達(dá)中, c/x/t 僅能存在一個(gè)!不可同時(shí)存在!
因?yàn)椴豢赡芡瑫r(shí)壓縮與解壓縮。
-z :是否同時(shí)具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
-j :是否同時(shí)具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
-v :壓縮的過(guò)程中顯示文件!這個(gè)常用,但不建議用在背景執(zhí)行過(guò)程!
參考資料來(lái)源:百度百科-linux命令
GNU/Linux的命令行選項(xiàng)有兩種類型:短選項(xiàng)和長(zhǎng)選項(xiàng),前者以 '-' 作為前導(dǎo)符,后者以 '--' 作為前導(dǎo)符
。比如有一個(gè)命令:
$ myprog -a vv --add -b --file a.txt b.txt - -- -e c.txt
在GNU/Linux系統(tǒng),對(duì)這種情況的一種合理解釋是:
a是短選項(xiàng),帶一個(gè)參數(shù)vv;
add是長(zhǎng)選項(xiàng),無(wú)參數(shù);
b是短選項(xiàng),無(wú)參數(shù);
file是長(zhǎng)選項(xiàng),帶一個(gè)參數(shù)a.txt;
b.txt是參數(shù);
-是參數(shù),通常表示標(biāo)準(zhǔn)輸入,stdin;
--是一個(gè)指示符,表明停止掃描參數(shù),其后所有部分都是參數(shù),而不是選項(xiàng);
-e是參數(shù);
c.txt是參數(shù)
為了簡(jiǎn)化程序設(shè)計(jì),有幾個(gè)庫(kù)函數(shù)可以優(yōu)雅地分析命令行參數(shù),原型如下:
#include unistd.h
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
#define _GNU_SOURCE
#include getopt.h
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
int getopt_long_only(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
我們先看看用于分析短參數(shù)的getopt函數(shù)。參數(shù)含義如下:
argc, argv是從main函數(shù)獲取的參數(shù),原樣傳給getopt;
optstring指示如何分析參數(shù)。
關(guān)于optstring,還有幾點(diǎn)說(shuō)明:
如果選項(xiàng)帶參數(shù),該選項(xiàng)后接冒號(hào),比如上例中optstring為"a:b",指示a帶參數(shù),b沒(méi)有參數(shù);
如果選項(xiàng)帶可選參數(shù),該選項(xiàng)后接兩個(gè)冒號(hào),比如"a::b",表明a可能有參數(shù),也可能沒(méi)有;
如果optstring的開(kāi)頭字符為':',表明如果指明選項(xiàng)帶參數(shù),而實(shí)際命令行沒(méi)有參數(shù)時(shí),getopt返回':'而不是'?'(默認(rèn)情況下返回'?',和無(wú)法識(shí)別的參數(shù)返回一樣);
如果optstring的開(kāi)頭字符為'+',表明一但遇到一個(gè)無(wú)選項(xiàng)參數(shù),馬上停止掃描,隨后的部分當(dāng)作參數(shù)來(lái)解釋;
如果optstring的開(kāi)頭字符為'-',表明如果遇到無(wú)選項(xiàng)參數(shù),則把它當(dāng)作選項(xiàng)1(不是字符'1')的參數(shù)
該函數(shù)每解析完一個(gè)選項(xiàng),就返回該選項(xiàng)字符。
如果選項(xiàng)帶參數(shù),參數(shù)保存在optarg中。如果選項(xiàng)帶可選參數(shù),而實(shí)際無(wú)參數(shù)時(shí),optarg為NULL。
當(dāng)遇到一個(gè)不在optstring指明的選項(xiàng)時(shí),返回字符‘?’。如果在optstring指明某選項(xiàng)帶參數(shù)而實(shí)際沒(méi)有參數(shù)時(shí),返回字符‘?’或者字符‘:’,視optstring的第一個(gè)字符而定。這兩種情況選項(xiàng)的實(shí)際值被保存在optopt中。
當(dāng)解析錯(cuò)誤時(shí),如果opterr為1則自動(dòng)打印一條錯(cuò)誤消息(默認(rèn)),否則不打印。
當(dāng)解析完成時(shí),返回-1。
每當(dāng)解析完一個(gè)argv,optind就會(huì)遞增。如果遇到無(wú)選項(xiàng)參數(shù),getopt默認(rèn)會(huì)把該參數(shù)調(diào)后一位,接著解析下一個(gè)參數(shù)。如果解析完成后還有無(wú)選項(xiàng)的參數(shù),則optind指示的是第一個(gè)無(wú)選項(xiàng)參數(shù)在argv中的索引。
函數(shù)getopt_long()的工作方式類似于getopt(),不過(guò)它還能接收長(zhǎng)選項(xiàng)。在接收長(zhǎng)選項(xiàng)之前,我們必須定義個(gè)一個(gè)結(jié)構(gòu)體數(shù)組變量longopts,指明我們希望獲取的長(zhǎng)選項(xiàng)。
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
含義如下:
name指明長(zhǎng)選項(xiàng)的名稱;
has_arg指明該選項(xiàng)是否帶參數(shù),1為是,0為否,2為可選;
flag指明長(zhǎng)選項(xiàng)如何返回,如果flag為NULL,則getopt_long返回val。否則返回0,flag指向一個(gè)值為val的變量。如果該長(zhǎng)選項(xiàng)沒(méi)有發(fā)現(xiàn),flag保持不變;
val指明返回的值,或者需要加載到被flag所指示的變量中。
option數(shù)組的最后一個(gè)元素必須全部填充0.
getopt_long的最后一個(gè)參數(shù)longindex在函數(shù)返回時(shí)指向被搜索到的選項(xiàng)在longopts數(shù)組中的下標(biāo)。longindex可以為NULL,表明不需要返回這個(gè)值。
getopt_long_only類似于getopt_long,但是它把'-'開(kāi)頭的選項(xiàng)當(dāng)作長(zhǎng)選項(xiàng)來(lái)處理。如果該選項(xiàng)與長(zhǎng)選項(xiàng)不匹配,而與短選項(xiàng)匹配,則可以作為短選項(xiàng)解析。
在短選項(xiàng)找到的時(shí)候,getopt_long和getopt_long_only的表現(xiàn)和getopt一樣。如果長(zhǎng)選項(xiàng)找到了,如果flag為 NULL,返回val,否則返回0。錯(cuò)誤情況的處理和getopt一樣,只是返回'?'時(shí)還可能是別的情況引起的:選項(xiàng)含糊不明確或者無(wú)關(guān)參數(shù)。
我們拿Linux手冊(cè)的一個(gè)例子來(lái)說(shuō)事。
#include stdio.h /* for printf */
#include stdlib.h /* for exit */
#include getopt.h
int
main (int argc, char **argv) {
int c;
int digit_optind = 0;
while (1) {
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 1, 0, ’c’},
{"file", 1, 0, 0},
{0, 0, 0, 0}
};
c = getopt_long (argc, argv, "abc:d:012",
long_options, option_index);
if (c == -1)
break;
switch (c) {
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;
case ’0’:
case ’1’:
case ’2’:
if (digit_optind != 0 digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.\n");
digit_optind = this_option_optind;
printf ("option %c\n", c);
break;
case ’a’:
printf ("option a\n");
break;
case ’b’:
printf ("option b\n");
break;
case ’c’:
printf ("option c with value ‘%s’\n", optarg);
break;
case ’d’:
printf ("option d with value ‘%s’\n", optarg);
break;
case ’?’:
break;
default:
printf ("?? getopt returned character code 0%o ??\n", c);
}
}
if (optind argc) {
printf ("non-option ARGV-elements: ");
while (optind argc)
printf ("%s ", argv[optind++]);
printf ("\n");
}
exit (0);
}
我們用digit_optind和this_option_optind來(lái)跟蹤選項(xiàng)012是否在一起,比如選項(xiàng) -012 和-0 -1 -2 的optind情況是不一樣的,前者返回0、1、2時(shí)optind相同,而后者optind的值依次大1。
希望你能看懂。。。
表示后臺(tái),系統(tǒng)不等程序的結(jié)束,直接返回接受下一條命令。
網(wǎng)站名稱:linux的c命令行參數(shù),C命令行參數(shù)
文章路徑:http://chinadenli.net/article14/hsigde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、微信小程序、網(wǎng)站營(yíng)銷、商城網(wǎng)站、企業(yè)網(wǎng)站制作、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)