【Linux】文件操作函数-cat命令-cp命令简单仿写

(一)库函数、系统调用

库函数:在函数库实现中、在用户空间调用执行

(1)C语言文件操作库函数
  1. FILE* fopen(const char* pathname, const char* mode); // mode "r"
  2. int fread(void* buff, size_t size, size_t count, FILE* fp);
  3. fwrite(void* buff, size_t size, size_t count, FILE* fp);
  4. fseek(FILE* fp, int offset, int whence); //移动读写游标
    // whence : SEEK_SET SEEK_CUR SEEK_END
  5. fclose(FILE* fp);
(2)Linux系统调用

在系统内核中实现,用户空间调用,内核空间执行

1.int open(const char* pathname, int flag);
int open(const char *pathname, int flags, mode_t mode);

参数详解:

  • pathname:路径文件名
  • flags:打开方式 O_RDONLY(只读)O_WRONLY(只写)O_RDWR(读写)O_APPEND(文本尾部追加打开) O_TRUNC(pathname文件存在,清空该文件,没有则创建)
  • O_CREAT: 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode ,表示该文件
    的访问权限。
  • 返回值
    失败-1,并设置全局erron
    成功返回文件描述符

2.int read(int fd, void* buff, size_t size);

参数详解:

  • fd:打开的文件描述符
  • buff:保存数据的buff缓冲区的首地址
  • size:一次读取的最大字节数(sizeof(buff) - 1)
  • 返回值:
    失败 -1
    读取到的字节个数

3.int write(int fd, void* buff, size_t size);

  • fd:文件描述符
  • buff:写入文件的缓冲区的首地址
  • size:buff中的真实数据大小
  • 返回值:
    失败 -1
    成功:写入的字节个数

4.lseek(int fd, int offset, int whence);

  • fd:文件描述符
  • offset:标志偏移量
  • whence: SEEK_SET SEEK_CUR SEEK_END
  • 返回值:
    成功:将结果偏移位置返回为从文件开头开始以字节为单位测量
    失败 -1 errno被设置为指示错误

5.int close(int fd);

关闭文件描述符

(二)用户态和内核态相关知识

侵删,点击参考

(三)系统调用的使用测试

从键盘获取,保存在mydata.txt文件中

#include <stdio.h>	//标准输入输出文件
#include <fcntl.h>	//系统调用头文件
#include <unistd.h>
#include <string.h>
void KeyIntoFile()
{
   
	int fd = open("mydata.txt", O_WRONLY |O_CREAT | O_TRUNC, 0664);
	if(fd == -1)
		return;
	printf("input data:\n");
	while(1)
	{
   
		char buff[128] = {
   0};
		fgets(buff, 127, stdin);
		if(strncmp(buff, "end", 3) == 0)
		{
   
			break;
		}

		write(fd, buff, strlen(buff));
	}
	close(fd);
	printf("saved\n");
}
int main()
{
   
	KeyIntoFile();
	return 0;
}

测试结果:
在这里插入图片描述

(四)实现cat的显示文件内容的功能

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
void Mycat(int argc, char* argv[])
{
   
	if(argc != 2)
	{
   
		perror("argc error"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值