linux操作 系统编程【笔记 续】

8 篇文章 0 订阅
6 篇文章 0 订阅

学习目标:

1、Linux上的文件操作函数


学习内容:

1、Linux上的文件操作函数

库函数和系统调用

库函数的实现是在函数库中,调用执行时,是在用户空间。 — 单次执行时,很快; 多次执行时,在两个空间反复横跳,就不好了

系统调用实现是在系统内核中,调用执行时,是在内核空间。(Windows的API)— 多次调用就可能会快一点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gj7MlqAB-1616857054637)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20210327164453693.png)]

Linux上的操作文件的系统调用

windows: fopen fread fwrite fseek fclose — 库函数

Linux:open read write lseek close || stat lstat fstat creat unlink link fcntl – 系统调用

man的使用

man 命令

man 2 系统调用

man 3 库函数

C语言中的库函数:

FILE* fopen(const char *filename,const char *mode);   //mode:"rw"

FILE* fread(char *buf,size_t size,size_t count,FILE* fp);  

FILE* fwrite(char *buf,size_t size,size_t count,FILE* fp);  

int fssek(FILE* fp,int offset,int whence);  //移动读写游标
//flag:  SEEK_SET  SEEK_CUR   SEEK_END

int fclose(FILE *fp);

char* fgets(char *s, int size, FILE *sfp);  //fp:  stdin  stdout

linux 的系统调用:

int open(const char *path, int oflag, /*int mode*/);
/*
path : 文件名

O_RDONLY:只读模式;O_WRONLY:只写模式;O_RDWR:可读可写 ;
O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件
O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
以下三个常量同样是选用的,它们用于同步输入输出
O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

mode : 只有flag设置了O_CREAT,才选mode,指定新创建文件的访问权限

返回值:如果失败返回-1,并设置全局erron
       成功返回文件描述符   大于等于0
*/

int read(int fildes, void *buf, size_t size);
/*
   files:是open打开的文件描述符,并且必须以读的方式打开
   buf:用户缓存区的首地址,用于保存读取到的数据
   size:一次最大读取的字节长度,一般是buf的大小
   
   返回值:失败返回-1  成功返回的是真正读取到的字节长度
*/

int write(int fildes, void *buf, size_t size);
/*
   buf:需要写入到文件中的数据的首地址
   size:buf中真实数据的长度
   
   返回值:失败返回-1  成功返回的是真正写入到文件中的数据长度
    
*/

int lseek(int fd,int offset,int whence);
/*
//flag:  SEEK_SET  SEEK_CUR   SEEK_END
*/

int close(int fd);

//复制现存文件
int dup(int fildes);
int dup2(int fildes, int fildes2);

节后练习:

  • 实现cat的现实文件内容的功能:
    对比

  • 利用操作文件系统调用 实现cp命令
    输出:

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>

//main :  ./mian  filename
int main(int argc,char *argv[])
{
	if(argc!=3)
	{
		printf("The number of file is error\n");
		exit(0);
	}

	char buf[128]={0};
	int fd,fd1,fd2;
	int len;
	fd1=open(argv[1],O_RDONLY);
	if(fd1!=-1)
	{
		fd=creat(argv[2],0775);
		if(fd!=-1)
		{
			fd2=open(argv[2],O_WRONLY);
			while((len=read(fd1,buf,127)) > 0)
				{
					write(fd2,buf,len);
				}
		}
		else{
			printf("error\n");
		}
	}
	else{
		printf("File is error\n");
	}

	return 0;

	
}

在这里插入图片描述


学习记录小点:
1、数组的特殊初始化方法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值