01 文件I/O

io学习路线顺序 print–>open–>error–>write–>阻塞–>lseek–>fcntl

print函数调用

~ printf调用操作系统的对外接口,write函数实现输出。—>系统调用
在这里插入图片描述

open/close 函数

第一个参数文件路径,第二个文件打开方式参数
返回文件描述符
结构体PCB 的成员变量file_struct *file 指向文件描述符表
STDIN_FILENO 0; 标准输入(文件描述符)
STDOUT_FILENO 1;标准输出
STDERR_FILENO 2;错误

<fcntl.h> 
<unlstd.h>
int fd = open("./file.txt", O_RDONLY);//返回文件描述符2 表示标准输出到屏幕
close(fd);关闭文件

在这里插入图片描述

错误函数

perror函数: void perror(const char *s);输出错误信息
查看错误号:
/usr/include/asm-generic/errno-base.h
/usr/include/asm-generic/errno.h

if(fd == -1){//打开文件错误
		perror("fcntl error");
		exit(1);
	}

read/write函数

read/write不使用函数库得buffer 一般执行到kernel返回
strace命令
shell中使用strace命令跟踪程序执行,查看调用的系统函数。

while((ret = read(fd, buf, sizeof(buf)))) {//参数一 文件描述符
        write(1, buf, ret);//1表示标准输入
    }

在这里插入图片描述

阻塞、非阻塞

从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞

注意,阻塞与非阻塞是对于文件而言的。而不是read、write等的属性。read终端,默认阻塞读。
read返回值:

  1. 返回非零值: 实际read到的字节数
  2. 返回-1: 1):errno != EAGAIN (或!= EWOULDBLOCK) read出错
    2):errno EAGAIN ( EWOULDBLOCK) 设置了非阻塞读,并且没 有数据到达。
  3. 返回0:读到文件末尾
#define MSG_TRY "try again\n"
#define MSG_TIMEOUT "time out\n"
if(errno != EAGAIN){   //EWOULDBLK  
			perror("read /dev/tty");
			exit(1);
		}
sleep(1);
if(i==5){
write(STDOUT_FILENO, MSG_TIMEOUT, strlen(MSG_TIMEOUT));//5秒后超时
}
write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));//再次尝试

lseek函数

修改文件偏移量(读写位置)
成功:返回的值是较文件起始位置向后的偏移量。
int fseek 成功返回0;失败返回-1

  1. 使用lseek拓展文件:write操作才能实质性的拓展文件 单lseek是不能进行拓展
    一般:write(fd, “a”, 1);
    od -tcx filename 查看文件的16进制表示形式
    od -tcd filename 查看文件的10进制表示形式

  2. 通过lseek获取文件的大小:lseek(fd, 0, SEEK_END); 【lseek_test.c】

len = lseek(fd, 999, SEEK_SET);//设置大小
int ret = write(fd, "a", 1);//引发拓展
int len = lseek(fd, 0, SEEK_END);//获取大小

fcntl函数

通过改变位图控制属性位置的0或者1开进行删除,添加属性

flags = fcntl(STDIN_FILENO, F_GETFL); //获取stdin属性信息
flags |= O_NONBLOCK;//异或添加属性
int ret = fcntl(STDIN_FILENO, F_SETFL, flags);//设置属性

在这里插入图片描述

如需转载,请标明此处

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值