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);