《APUE》第三章笔记(2)

read函数

调用read函数从打开的文件中读数据。

#include <unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes);

返回值:若成功则返回读到的字节数,若文件已到结尾则返回0,出错返回-1


有多种情况可使实际读到的字节数少于要求读的字节数

1.读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回30.下一次再调用read时,它将会返回0(文件尾端)。

2.当从终端设备读时,通常一次最多读一行(能够改变)。

3.从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数(也就是说,你要求读的字节数大于网络中的缓冲区长度了)。

4.其他(现在暂时用不到也就不写了)


write函数

调用write函数为打开的文件写数据

#include <unistd.h>

ssize_t write(int filedes, const void *buf, size_t nbytes);

返回值:若成功则返回已写的字节数,出错返回-1


其返回值通常与参数nbytes的值相同,否则表示出错。出错的常见原因是:磁盘已写满,或者超过了一个给出进程的文件长度限制。


I/O效率

所有常用的UNIX系统shell都提供一种方法,它在标准输入上打开一个文件用于读,在标准输出上创建(或重写)一个文件。这使得程序不必自行打开输入和输出文件。


下面一个程序是将标准输入复制到标准输出:

/*Copy standard input to standard output*/
#include "apue.h"

#define BUFFSIZE	4096

int main(void)
{
	int	n;
	char	buf[BUFFSIZE];

	while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
		if (write(STDOUT_FILENO, buf, n) != n)
			err_sys("write error");

	if (n < 0)
		err_sys("read error");

	exit(0);
}
因为是终端的标准输入和标准输出,就不用打开和关闭了。


结果如下:

《APUE》第三章笔记(2)


第三章笔记待续。


你可能感兴趣的:(笔记)