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