計(jì)算機(jī)等級(jí)考試C++學(xué)習(xí)雜記
其中fcntl(int fields,int cmd,...)函數(shù)中的第一個(gè)參數(shù),可以用字符型轉(zhuǎn)整型函數(shù)atoi(argv[i])獲得對(duì)參數(shù)的FD值,也可以通常定義一個(gè)int fd;然后利用open取得.故fcntl的示例如下:
<1>.int fd=open("new.txt",O_RDONLY);
if (fcntl(fd,F_GETFL,0)<0)...
<2>.if (fcntl(atoi(argv[1],O_RDONLY)<0)...
在steven的 這本書中,關(guān)于fcntl函數(shù)的運(yùn)用中,有如下:
#./a.out 0 < /dev/tty
結(jié)果:read only
#./a.out 1 >temp.foo
結(jié)果:write only
#./a.out 1
結(jié)果:read write
#./a.out 2 2>>temp.foo
結(jié)果:write only,append
#./a.out 5 5<>temp.foo
結(jié)果:read write
舉個(gè)例子:
(1).參數(shù)問(wèn)題
#./pro1 file1 file2>file3
時(shí),僅有pro1和file1傳遞給了pro1進(jìn)程,分別作為argv[0],argv[1].
而file2>file3由shell處理,在fork()之后,執(zhí)行exec系統(tǒng)調(diào)用前,打開文件file3,并將文件file3的句柄復(fù)制到file2,
并在exec時(shí)設(shè)置文件句柄file2打開.
1>.所以以上執(zhí)行時(shí),#./a.out 1 >temp.foo,1是標(biāo)準(zhǔn)輸出,表示STDOUT_FILENO,此時(shí)1的句柄被重定向?qū)懙揭粋€(gè)文件中,所以
結(jié)果正好是:write only. (temp.foo以只寫方式打開)
2>.執(zhí)行#./a.out 1
這個(gè)時(shí)候,由于0,1,2句柄都是指向你的登陸終端文件,而該終端是刻度寫的,所以是read write.
3>.執(zhí)行#./a.out 2 2>>temp.foo
時(shí),shell在open temp.foo時(shí),加了個(gè)APPEND標(biāo)志,以表明是追加.
4>.同樣,執(zhí)行#./a.out 5 5<>temp.foo時(shí),<為讀出,>為重定向輸入,所以結(jié)果為:read write.
3.文件共享
UNIX系統(tǒng)支持在不同進(jìn)程間共享打開的文件.內(nèi)核使用三種數(shù)據(jù)結(jié)構(gòu)表示打開的文件.
<1>.每個(gè)進(jìn)程在進(jìn)程表中有一個(gè)記錄項(xiàng),記錄項(xiàng)中包含有一張打開文件描述符表,可將其視為一個(gè)矢量,每 個(gè)描述符占用一項(xiàng).
<2>.內(nèi)核為所有打開文件維持一張文件表.
<3>.每個(gè)打開文件(或設(shè)備)都有一個(gè)V節(jié)點(diǎn)結(jié)構(gòu).
4.解釋 int main(int argc,char* argv[ ])中的參數(shù)涵義.
其中argc是命令行參數(shù)個(gè)數(shù).argv[]是命令行參數(shù)
argv[0]是程序名,argv[1]是第一個(gè)參數(shù),可以為一個(gè)文件名,一個(gè)字符串,或者一個(gè)數(shù)值.
argv[2]是第二個(gè)參數(shù),依此類推.
比如有:#./program1 -e new.txt
其有三個(gè)命令行參數(shù),即argc=3
argv[0]=program1
argv[1]=-e
argv[2]=new.txt
一般若在程序中有:
if(argc!=2) cout<<"Input parameter"<
此處的判斷用于檢查是否輸入了應(yīng)該輸入的參數(shù).實(shí)際上在調(diào)用程序的時(shí)候,并不需要輸入argc的值.
argc的值是根據(jù)你運(yùn)行程序時(shí)的參數(shù)個(gè)數(shù)來(lái)定的.
5.若有int main(int argc,char* argv[])
則argv在此表示一個(gè)字符串?dāng)?shù)組,由于[]里面的數(shù)目是不固定的,故可以指定為任意值。當(dāng)在引用值時(shí),如:
string hhstr;
hhstr=argv[1]; //正確
hhstr=*argv[1]; //結(jié)果確不是一個(gè)字符串,而是字符串的第一個(gè)字母。
6.string類型字符串不能賦值給char*的變量。
7.該是指針參數(shù)的地方一定要用引用把地址傳給它,或?qū)⒅羔槀鹘o它。