发新话题
打印

C++学习杂记

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

TOP

发新话题