Linux/unix系统编程手册-第四章 文件I/O 笔记(1)

Linux/unix系统编程手册-第四章 文件I/O 笔记(1)

  • 所有执行I/O操作的系统调用都以文件描述符,一个非负整数(通常是小整数)来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。针对每个进程,文件描述符都自成一套。

  • 在程序运行之前,shell代表程序打开3种标准的文件描述符。程序继承了shell文件描述符的副本,在shell日常操作中,这三个文件描述符是时钟打开的。在交互式shell中,这三个文件描述符通常指向shell运行所在的终端。如果命令行指定对输入/输出进行重定向操作,那么shell会对文件描述符做适当修改,然后再启动程序。

文件描述符用途POSIX名称stdio流
0标准输入STDIN_FILENOstdin
1标准输出STDOUT_FILENOstdout
2标准错误STDERR_FILENOstderr
  • 在程序中指代这些文件描述符时,可以用数字(0、1、2)表示,或者采用<unistd.h>所定义的POSIX标准名称(这种方法较好)。

  • 文件I/O操作的4个主要系统调用:

    • fd = open(pathname, flags, mode)函数打开pathname所标识的文件,并返回文件描述符fd,用以在后续函数调用中指代打开的文件。如果文件不存在,open()函数可以创建要打开的文件,但是这取决于flags参数。flags参数表示以何种方式打开文件:只读、只写、读写。mode参数则指定由open()函数所创建的文件的访问权限;如果open()函数并未创建文件,则该参数可不指定。

    • numread = read(fd, buffer, count)调用从fd指代的打开文件中读取之多count字节的数据,并存储到buffer中。该函数的返回值为实际读取到的字节数。如果再无字节可读(如读到文件结尾符EOF时),则返回值为0。

    • numwritten = write(fd, buffer, count)调用从buffer中读取多达count字节的数据写入由fd指定的文件中。该函数返回值为实际写入文件中的字节数,且有可能小于count值。

    • status = close(fd)函数表示在所有输入/输出操作完成后,释放文件描述符fd以及与之有关的内核资源。


/*
** 实现将源文件内容复制到新文件中
** ./4-1-copy oldfile newfile
** 将oldfile内容复制到newfile中
*/

/*获取有关文件状态的函数*/
#include <sys/stat.h>
/*包含文件操作的函数*/
#include <fcntl.h>
/*包含书中提供的头文件(该同文件包含一些标准操作)*/
#include "../lib/tlpi_hdr.h"

/*定义缓存区大小*/
#ifndef BUF_SIZE
#define BUF_SIZE 1024
#endif

int main(int argc, char const *argv[])
{
	int inputFd, outputFd, openFlags;//文件描述符,文件描述符,打开文件标志
	mode_t filePerms;//文件权限,创建文件时使用;底层为unsigned int类型
	ssize_t numRead;//读取文件长度
	char buf[BUF_SIZE];//缓存

	if (argc != 3 || strcmp(argv[1], "--help") == 0)
	{
		usageErr("%s old-file new-file\n", argv[0]);
	}

	/*打开源文件*/
	inputFd = open(argv[1], O_RDONLY);
	if (-1 == inputFd)
	{
		errExit("opening file %s", argv[1]);
	}

	/*打开文件的主标志:O_RDONLY只读;O_RDWR可读可写;O_WRONLY只写*/
	/*打开文件的副标志:O_APPEND,读写文件从文件尾部开始移动,所写入的数据追加到文件尾部*/
	/*O_TRUNC,若文件存在并且以可写方式打开时,此标志会将文件长度清0,原有数据消失*/
	/*O_CREAT,若路径中的文件不存在则自动建立该文件*/
	/*O_EXCL,如果与O_CREAT同时设置,此标志会是能检查文件是否存在,文件不存在则建立文件
	**否则将导致打开文件错误。若同时设置打开的时文件为符号链接文件,则将导致打开文件失败*/
	/*主标志之间是互斥的,可配合使用副标志*/
	openFlags = O_CREAT | O_WRONLY | O_TRUNC;
	/*文件权限标志:S_IRUSR,所有者拥有读权限;
	*S_IWUSR,所有者拥有写权限;
	*S_IXUSR,所有者拥有执行权限;
	*S_IRGRP,群组拥有读权限;
	*S_IWGRP,群组拥有写权限;
	*S_IXGRP,群组拥有执行权限;
	*S_IROTH,其他用户拥有读权限;
	*S_IWOTH,其他用户拥有写权限;
	*S_IXOTH,其他用户拥有执行权限;
	*正好就是Linux中指定的文件权限
	*/
	/*文件权限:rw-rw-rw-*/
	filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |\
				S_IROTH | S_IWOTH;

	/*打开或创建要写入的文件*/
	outputFd = open(argv[2], openFlags, filePerms);
	if (-1 == outputFd)
	{
		errExit("opening file %s", argv[2]);
	}

	/*将源文件的内容读到缓存,然后写入目标文件*/
	while((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
	{
		if (write(outputFd, buf, numRead) != numRead)
		{
			fatal("could't write whole buffer");
		}
	}

	if (numRead == -1)
	{
		errExit("read");
	}

	if (close(inputFd) == -1)
	{
		errExit("close input");
	}
	if (close(outputFd) == -1)
	{
		errExit("close output");
	}

	exit(EXIT_SUCCESS);
	//return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值