计算机等级考试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.该是指针参数的地方一定要用引用把地址传给它,或将指针传给它。