【Linux学习笔记26】系统IO初简介(open函数的使用)

本文详细介绍了系统IO的特点,对比标准IO,强调了系统IO在处理socket等特定场景下的必要性。同时,深入讲解了Linux文件类型,并演示了如何使用open函数进行文件操作,包括其参数、返回值及常见标志位的使用。

系统IO的特点

  1. 系统IO的操作的对象是文件描述符。标准IO的对象是文件指针。
  2. 系统IO并不带缓冲,因此每次对系统IO的操作都视为数据与内核相交互。
  3. 某些场合下,只能使用系统IO。例如:处理socket的时候,只能使用系统IO,标准IO不行。

Linux中的文件类型简介

可以在Linux系统中,使用ls -l进行查看各种文件类型

  1. 目录 (d)
  2. 普通文件 (-)在这里插入图片描述
  3. 字符设备 (c)
  4. 块设备 (b)
  5. 符号链接文件 (l)在这里插入图片描述
  6. 本地预套接字 (s)
  7. 管道 (p)

如何使用系统IO存储文件

  1. Open()函数的使用
函数简介

首先了解一下这个函数的使用方法:

man 2 open

在这里插入图片描述
值得我们注意的是,open函数的返回值:
在这里插入图片描述
open函数会返回一个文件描述符,那么如果文件打开成功的话,会返回一个大于0的值,如果打开失败则返回一个-1值。

描述符是什么

那么,这个值代表什么意思呢?(下面引用一张图)
在这里插入图片描述

  • 假如我们要使用Open函数打开一个a.txt的文件,那么在a.txt文件创建的时候,在内核空间就已经使用结构体中的其中一个指针指向这个a.txt。
  • 当我们使用Open函数打开a.txt的时候,内核空间会根据open传递过来文件的名字,在结构体中找到指向a.txt的指针,那么在结构体中,指针也有下标的,这个i下标的指针就是指向a.txt的指针,当找到a.txt后,内核空间会把i返回给open,这个i 就是描述符。

open函数中的flag:

在这里插入图片描述

flags作用
O_RDONLY以只读的方式打开文件
O_WRONLY以只写的方式打开文件
O_RDWR读写方式打开文件
O_CREAT如果文件不存在,则创建该文件
O_EXCL如果使用O_CREAT选项且文件存在,则返回错误信息
O_NOCTTY如果文件为终端,那么终端不可以作为调用Open()系统调用的那个进程的控制终端
O_TRUNC如文件已经存在,则删除文件中原有的数据
O_APPEND以追加的方式打开文件
代码实现

在这里插入图片描述
在这里插入图片描述

为什么fd输出为3呢?
在这里插入图片描述

PComm 库函数 PComm 库函数是台湾MOXA公司提供的,他为用户提供了基于win32 api的开发接口。 PComm库函数分为7大类 控制函数、数据输入函数、数据输出函数、状态函数件驱动函数、传输文件函数、特殊设定函数 上述函数均返回int型数据,若函数调用成功则返回0,否则返回一个负整数。 控制函数主要包括 sio_open(PortNum) 打开串口 sio_close(PortNum) 关闭串口 sio_ioctl(PortNum, baud, mode)设置串口的工作模式,包括 波特率,数据位元,停止位,效验等 sio_flush(portNum,func)清除发送、接收缓冲区 其中func 为0清空输入 ,为1清空输出,为2清空输入输出 sio_SetWriteTimeouts(int port,DWORD TotalTimeouts):设置串口写操作的超时。 sio_lctrl(Portnum,mode) 设置串口RTS/DTS。 待定 数据输入函数主要包括 sio_getch(PortNum) 从输入缓冲区读一个字符 sio_read(PortNum,buf,len) 从输入缓冲区读指定个数的字符 sio_iqueue(Portnum)读取输入缓冲区中的字符长度 数据输出函数主要包括 sio_putch(PortNum) 写一个字符到输出缓冲区 sio_write(PortNum,buf,len)写指定个数的字符到输出缓冲区 状态函数主要包括 sio_lstatus(portNum)获取串口的CTS,DSR,DCD,RI线的状态 sio_getbaud(portNum)获取串口的波特率 sio_getmode(portNum)获取串口的工作模式。对应sio_ioct函数 函数主要包括 sio_term_irq(portNum,func,code) 当接收到指定字符时响应件,func为回调函数名,code为指定的字符 sio_cnt_irq(PortNum,func,count) 当接收到指定个数字元时响应件,func为回调函数名,count接收的个数 传输文件函数主要包括 sio_FtASCIITx(portNum,fname,func,key)发送一个文本文件 sio_FtASCIIRx(portNum,fname,func,Key,sec)接收一个文本文件 int i,Ret,DataLen; FILE *fp1; uchar RetDataC[30],WriteData[24],PSC[5]; Ret = sio_open(port); if (Ret != SIO_OK ) return(-1);//打开串口错误 Ret = sio_ioctl (port, B9600, P_NONE | BIT_8 | STOP_1 ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 } /*Ret = sio_lctrl (port, C_DTR | C_RTS ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 }*/ /*Ret = sio_flush(port,2); if (Ret != SIO_OK){ sio_close(port); return(-3);//清空 输入和输出缓冲区的数据 }*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值