系统IO

本文深入讲解Linux系统下文件操作的基本概念和技术细节,包括文件类型、常用文件操作函数(如open、close、read、write等)、文件描述符复制及偏移等,并通过实例演示如何使用这些函数实现文件复制。
摘要由CSDN通过智能技术生成
linux系统,一切皆文件!

c  ---》字符设备文件(传输数据是字节的形式传输的)键盘,鼠标,游戏遥感,蓝牙耳机
d ---》目录 文件
l ---》 链接文件
b ---》块设备文件(传输时带缓存1024字节的设备文件)U盘,硬盘
s ---》网络套接字文件(用于网络通信)
p ---》管道文件(用于进程通信)

#include <stdio.h>
#Include <errno.h>
输出标准出错信息:
void perror(const char *s);

man 手册:
       1   可执行程序或 shell 命令
       2   系统调用(内核提供的函数)
       3   库调用(程序库中的函数)
       4   特殊文件(通常位于 /dev)
       5   文件格式和规范,如 /etc/passwd
       6   游戏
       7   杂项(包括宏包和规范,如 man(7), groff(7))
       8   系统管理命令(通常只针对 root 用户)
       9   内核例程 [非标准

man 2 open :
open:函数
头文件:
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>
open打开函数原型:
       int open(const char *pathname, int flags);
参数一:需要打开的文件路径
参数二:打开文件的权限
O_RDONLY   可读
O_WRONLY   可写
O_RDWR    读写
返回值:成功返回一个新的文件描述符,失败返回-1.
-----------------------------------------------------------------------------------------------------------
关闭函数close
头文件:
         #include <unistd.h>
close函数原型:
    int close (int fd)
参数:需要关闭的文件描述符
返回值:关闭成功返回0,关闭失败返回-1.
-----------------------------------------------------------------------------------------------------------
带创建功能的open函数,创建文件并打开
函数原型:
         int open(const char*pathname,int flags ,mode_t mode);
参数一:文件了路径名
参数二:打开文件的权限
                   O_RDONLY    可读
                   O_ERONLY     可写
                   O_RDWR        可读写(这三个三选一)
                   -----------------------------------------------------------
                   O_CREAT          带创建功能打开     O_EXCL(配合创建模式会检查文件是否存在,假如存在则创建失败)
                   O_TRUNC          刷新源文件内容(会把原来文件内容清空)
                   O_APPEND      以追加方式打开
                   -----------------------------------------------------------
参数三:创建文件的权限
                   S_IRWXU          文件所有者拥有可读可写可执行权限
                   S_IRWXG          文件所属组有可读可写可执行权限
                   S_IRWXO          其他用户拥有可读可写可执行权限
-----------------------------------------------------------------------------------------------------------
只创建不打开文件:
函数原型:int  creat(const char *pathname,mode_t mode);
参数一:创建的文件名
参数二:创建的文件权限
例子:
creat("my,txt",S_IRWXU | S_IRWXG | S_IRWXO)  等价于  open("my.txt",O_CREAT |O_EXCL,S_IRWXU | S_IRWXG | S_IRWXO);
--------------------------------------------------------------------------------------------------------
写操作:write
头文件:#include <unistd.h>
函数原型:
    ssize_t write (int fd,const void *buf,size_t count);
参数一:要写入的文件描述符
参数二:数据的缓存地址
参数三:要写入的数据大小
返回值:成功返回读取的数据大小
                 读到文件末尾返回0
                 读取失败返回-1
-----------------------------------------------------------------------------------------------------------
读函数read
头文件:
         #include <unistd.h>
函数原型:
         ssize_t read (int fd,void *buf,size_t count);
参数一:要读取的文件描述符
参数二:读取文件后的内容存放区
参数三:要读取的数据大小
返回值:成功返回读取的数据大小
                 读到文件末尾返回0
                 读取失败返回-1

注意:写操作不可以越界,读操作可以越界(因为写函数会按照用户要求二的数据大小写入文件,假如数据不满足用户需求的大小则write函数会自己补充内容写入)
-----------------------------------------------------------------------------------------------------------
利用系统IO函数实现一个linux的cp命令
例如   ./cp  源文件    目标文件
代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
char buffer[100] = {0};
int fd1 = open(argv[1],O_RDWR);
int fd2 = open(argv[2],O_RDWR | O_CREAT | O_EXCL);
int ret1,ret2;
if(fd1 < 0)
perror("源文件不存在,open fail1\n");
if(fd2 < 0 )
perror("目标文件不存在,open fail2\n");
while(1)
{
ret1 = read(fd1,buffer,sizeof(buffer));
if(ret1==0)
{
printf("读取完毕!\n");
break;
}
}
ret2 = write(fd2,buffer,strlen(buffer));
printf("ret1 = %d\n",ret1);
printf("ret2 = %d\n",ret2);
close(fd1);
close(fd2);
return 0;
}
-----------------------------------------------------------------------------------------------------------
文件指针偏移函数:文件指针是一个记录当前位置的东西
lseek函数:
头文件:
         #include  <sys/types.h>
         #include <unistd.h>
函数原型:
         off_t lseek(int fd,off_t offset,int whence);
参数一:需要偏移的文件描述符
参数二:要偏移的大小
参数三:文件偏移的相对位置
              SEEK_SET               文件头
              SEEK_CUR               文件指针当前位置、
              SEEK_END               文件尾
返回值:成功返回偏移的大小
                   失败返回-1

往一个文件中write(fd)写入数据并read(fd)读取改文件写入的数据输出到终端,并计算该文件的大小输出
代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
char buffer[100] = {0};
int fd = open("lseek.txt",O_RDWR);
if(fd < 0 )
printf("open file fail!\n");
int b = write(fd,"12345678",strlen("12345678"));
int a = lseek(fd,0,SEEK_SET);
int ret = read(fd,buffer,sizeof(buffer));
printf("buffer = %s\n",buffer);
printf("文件大小 = %d\n",ret);
close(fd);
return 0;
}
-----------------------------------------------------------------------------------------------------------
文件描述符复制函数
头文件:
#Include <unistd.h>
函数原型:
    int dup(int oldfd);
参数:旧的文件描述符
返回值:最少的新文件描述符

文件描述符重定向:
         int dup2(int oldfd,int newfd);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值