初级程序员
|
1#
大中
小发表于 2007-11-13 09:39 只看该作者
C++学习杂记
C++学习杂记
来源于:http://ncre.csai.cn/ncreexe/200705081347131058.htm
1.在平常的调试中,可以用strerror(errno)来得出异常的信息,strerror函数包含在头文件errno.h中.也可以利用perror(char*)来捕捉到异常并输出信息。
2.read,write,close,fcntl,open,dup2,dup等IO操作函数中,有三个参数可以注意:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO这三个参数通常用0,1或2表示。
其中fcntl(int fields,int cmd,...)函数中的第一个参数,可以用字符型转整型函数atoi(argv)获得对参数的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的 <UNIX环境编程> 这本书中,关于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"<<endl;
此处的判断用于检查是否输入了应该输入的参数.实际上在调用程序的时候,并不需要输入argc的值.
argc的值是根据你运行程序时的参数个数来定的.
4.若有int main(int argc,char* argv[])
则argv在此表示一个字符串数组,由于[]里面的数目是不固定的,故可以指定为任意值。当在引用值时,如:
string hhstr;
hhstr=argv[1]; //正确
hhstr=*argv[1]; //结果确不是一个字符串,而是字符串的第一个字母。
4.string类型字符串不能赋值给char*的变量。
5.该是指针参数的地方一定要用引用把地址传给它,或将指针传给它。
|