now,i will wirite down something about API of UNIX/Linux. 采取不定时持续的方式做笔记。
utime()函数可以结合open()的trunc选项将某人的文件截断并且不更改文件的修改时间。
当进程不停的切换工作目录时,记住当前工作目录是重要的,内核只记住了当前工作目录的i_node,但是getcwd()可以提取当前工作目录,记下它,在其他目录中调用chdir()切回原来的工作目录
软硬链接用起来就像快捷方式一样非常舒服(硬链接是创建一个文件名字指向一个已有的i_node,软连接则是创建一个新的i_node这才是跨文件系统的根本),但是遍历目录时,特别要小心函数是否跟随链接,这是个可以导致崩溃的问题
文件的设置用户ID也是个很有用的东西,它能让进程获得额外的权限,passwd就是个很好的例子,记住它。
文件共享的那几张表,时刻记在脑海中:不同进程持有不同文件表项但是不同的i_node,不同进程持有不同的表项但是属于同一i_node,不同进程共享同一文件表项
原子操作的理念,尤其是并发的时候,这个我已经感受到并发带来的麻烦了
umask()函数可以控制产生的文件的权限
unlink()的特点让它可以在程序崩溃时删除临时文件,不错的性能,在创建问文件后就就调用unlink(),过后临时文件自然会被删除
access()测试文件权限
粘住位S_ISVTX一个应用场景是:多个用户在一个目录下都拥有文件,设置粘住位可以防止各用户间的删除更名其它用户的文件
chroot()函数可以更改进程的根目录(用于解析绝对路径名),更改后可以限制进程的搜索文件范围,提高了速度和安全性
文件流指针是针对带缓冲的I/O所以带有缓冲区的信息,所以比不带缓冲I/O函数的文件描述符的结构复杂。每个进程都预定义了三个流(stdin,stdout,stderr和三个文件描述符STDIN_FILENO。。。指向文件一致)。针对不同的字符流,流可以重定向fwide()。缓冲机制有三种:行缓冲(主要用于终端交互设备)、全缓冲(磁盘读写)、不带缓冲(通常stderr是),通过setbuf()可以开关流,setvbuf()可以更改缓冲类型。
打开流的函数中注意freopen()可以将文件描述符转换为文件流指针,这通常用于那些不能用fopen()函数不能打开的文件,如管道和网络通信通道函数返回的描述符。
读写流:
一次读写一个字符getc(),fgetc(),getchar().
ungetc()能回送一个字符给流吗,这用于文本文件分析(该字符与下一个字符一起分析)似乎不错,这仅仅作用于流,并没有送回给文件。
输出:putc(),fputc(),putchar()
行I/O:fgets(),gets()注意后者对于缓冲区没有限制,容易造成缓冲区溢出(bug)。对应的输出行函数为fputs(),puts()。gets(),puts()总是每次都将换行符写入或者写出终端,这和实际情况可能不太一样,毕竟不是每次我都是写或者输入完整的一行给终端啊。
setjmp(), longjmp()在函数级间跳转时注意全局变量,静态变量,volatile变量不会回滚。其它变量不确定
子进程获得父进程数据空间、堆栈的副本,父子进程并不共享这些部分。父子进程共享正文段。
fork(),vfork()区别是vfork()并不将父进程的地址空间完全复制到子进程中且vfork()保证子进程先运行且子进程在父进程的地址空间运行(可以更改父进程的
变量)
等待子进程终止调用wait(),等待父进程终止 while(getppid()!=1)sleep(1);
system(),popen()函数可以调用shell执行一串以null结尾的shell命令。设置用户ID和设置组ID程序绝不应调用system函数。
信号处理程序调用一些不可重入函数将会导致错误
想要捕捉alarm()函数则先要安装信号处理程序,否则系统默认受到SIGALRM是终止进程
pause()函数只有在执行了一个信号处理程序并从其返回时,pause才返回
低速系统调用在遇见中中断时是个很好的自动重启的机会