Linux基础与应用开发系列九:各类系统函数与标准IO函数

open_close函数

OPEN函数

头文件:

cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函数原型:

  • 当文件存在时

    复制代码
    int open(const char* pathname,int flags)
  • 当文件不存在时

    复制代码
    int open (const char* pathname,int flags,int perms)

返回值

成功:文件描述符

失败:-1

CLOSE函数

头文件:

复制代码
#include <unistd.h>

函数原型:

复制代码
int close(int fd)

返回值:

成功:0

失败:-1

程序验证步骤

程序

cpp 复制代码
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>




int main(int argc,char** argv)

{
	int fd1,fd2;
	char buf[512];
	int read_size;

	if(argc!=3)
	{
		printf("param error!!\r\n");
		return -1;
	
	
	}
	fd1= open(argv[1],O_RDONLY);
	fd2= open(argv[2],O_WRONLY|O_CREAT,0666);

	if (fd1<0||fd2<0)
	{
		printf("open erro!\r\n");
		return -1;
	}
	while (1)
	{
		read_size=read(fd1,buf,512);
		if (read_size==0)
		break;
		write(fd2,buf,read_size);
		
	}
	
   close(fd1);
   close(fd2);
   return 0;


}

赋权限

gec@ubuntu:~/IO_program$ sudo chown -R gec ~/IO_program/part_2

lseek函数

功能

设置文件读写位置

头文件
复制代码
#include <unistd.h>
函数原型
复制代码
off_t lseek(int fd,off_t offset,int whence)
  • 若whence为SEEK_SET,基准点为文件开头

  • 若whence为SEEK_CUR,基准点为当前位置

  • 若whence为SEEK_END,基准点为文件末尾

返回值

成功:文件偏移位置值

失败:-1

sync函数

页缓存和回写
功能

强制把修改过的页缓存区数据写入磁盘

头文件
复制代码
#include <unistd.h>
函数原型
复制代码
void sync(void);
返回值

代码

cpp 复制代码
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>


int main()

{
	int fd =open("file",O_RDWR|O_CREAT,0666);
    write(fd,"123",3);
    lseek(fd,100,SEEK_CUR);
    write(fd,"abc",3);
    sync();
    close(fd);
    return 0;


}

标准IO函数

C标准库实现了一个IO缓存区

常见标准IO函数

  • fopen

  • fclose

  • fread

  • fwrite

  • fseek

  • fflush

    强制把IO缓存区的数据写入到页缓存区

文件IO五大模式

  • 阻塞模式:在阻塞模式下,当一个系统调用被执行时,调用方将会被阻塞(即进入睡眠状态)直到操作完成并返回结果。在这种模式下,调用方必须等待IO操作的完成,不能进行其他任务。
  • 非阻塞模式:在非阻塞模式下,系统调用立即返回,而不管IO操作是否已经完成。如果IO操作未完成,调用方可以继续进行其他任务,然后再次检查IO操作的状态。这种模式下的系统调用通常是非阻塞的。
  • IO多路复用:IO多路复用是一种同时监听多个IO事件的机制。它通过将多个IO事件注册到一个或多个特定的监视器(如select、poll、epoll等),从而实现在单个线程中同时处理多个IO请求的能力。这样可以提高系统的并发性能,避免大量阻塞和非阻塞IO操作带来的开销。
  • 异步IO:异步IO是一种IO模型,其中IO操作的发起和完成是分离的,应用程序可以在IO操作完成之前继续执行其他任务。在发起IO操作后,应用程序可以继续进行其他工作,并通过回调函数或者轮询等方式来获取IO操作完成的通知或结果。异步IO可以提高系统的吞吐量和响应性能。
  • 信号驱动IO:信号驱动IO也是一种IO模型,它使用信号来通知应用程序IO操作的完成。在信号驱动IO模式下,当IO操作完成时,系统会发送一个信号给应用程序,应用程序通过注册信号处理函数来处理相应的IO事件。这种模式可以提高应用程序对IO操作的响应速度,但在处理复杂IO逻辑时可能较为繁琐。
相关推荐
fatiaozhang95277 分钟前
中兴B860AV1.1_晨星MSO9280芯片_4G和8G闪存_TTL-BIN包刷机固件包
android·linux·adb·电视盒子·av1·魔百盒刷机
froxy7 分钟前
Panthor 开源方案与 Mesa 图形库的技术解析
linux·开源
nice_evil13 分钟前
华为Openeuler/Linux/CentOs 网络配置及故障排查/远程连接设置ssh/ibmc等问题及解决方案合集
linux·网络·centos·openeuler·网络配置与激活
liulilittle22 分钟前
OpenSSL 的 AES-NI 支持机制
linux·运维·服务器·算法·加密·openssl·解密
yzx99101333 分钟前
柑橘检测模型
服务器·人工智能·深度学习·算法
南枝异客36 分钟前
电话号码的字母组合
开发语言·javascript·算法
无聊的小坏坏42 分钟前
进程间通信详解(三):Linux进程信号深度解析
linux·bash
快乐肚皮1 小时前
快速排序:分治思想的经典实践
java·算法·排序算法
qq_243050791 小时前
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
linux·web安全·网络安全·黑客·教程·kali linux·voip工具
风清再凯1 小时前
docker镜像的构建image
运维·docker·容器