1.字符操作函数是否以NULL结束.
一定以null结束缓冲区的函数:
fgets, snprintf,
不一定null结束缓冲区的函数:
strncpy, memcpy, readlink
特别:
fgets尝试保持换行符,除非换行符的位置>=缓冲区大小.
snprintf返回值为字符串大小,可能比缓冲区大,这表示字符串已被截断.
strncpy和memcpy的size_t表明的是应该从src复制多少字节,不过和普通的也没多大差别.
--------------------
2.io函数参数中文件的标识符的位置
系统调用read, write等统一把文件描述符作为第一个参数;
ISO C函数中,格式化输出转换函数族(即fprintf, vfprintf等)把文件流指针(FILE*)作为
第一个参数,除此之外,其他函数都把流指针作为最后一个参数,如fread, fwrite, fgets.
-------------------
3.io函数参数中的缓冲区大小和缓冲区指针及缓冲区个数
系统调用缓冲区指针放在三者的最前面,紧跟缓冲区大小,例如read,如果有指定缓冲区个
数,则放置在最后,例如readv,不过此时缓冲区用一个结构体表示,里面包含指针和大小.
ISO C函数大致和系统调用一样,但未发现有参数指定缓冲区个数.
-------------------
4.read/write和fread/write的其他区别
后者可用于结构化输入输出,所以size参数指定每个结构的大小,而多一个nmemb指定传输
结构的个数,而前者只指定一个缓冲区大小;
read遇到EOF时返回0,而fread返回出错,所以要使用feof或ferror支判断到底是否出错.
-------------------
5.参数中src和dst的位置
memcpy, strncpy, snprintf等ISO C函数都把dst性质的参数放在src性质的参数之前,不
明白这种安排的原因.
而除去ISO C之外,其他库函数和系统调用,如inet_ntop, symlink, dup2等都依照from src to dst的顺序放置.
特别:
symlink有些拗口,从src创建一个目标连接dst.
dup2的src是oldfd,dst是newfd,表示关联oldfd表示的文件到newfd.
-------------------