input & output:站在应用层考虑
Input:内核–>用户,从内核读取数据或从文件读取数据 ————read函数
Output:用户–>内核,写数据到内核或写数据到文件中 ————write函数
open函数
作用:打开和创建文件(open()失败返回值为-1)
#include<fcntl.h> //需要的头文件
int open(constchar*pathname,int flags);//打开已有的文件
int open(constchar*pathname,int flags,mode_tmode);//创建文件
//例子如下
fd = open("/home/user/app.c", O_RDWR | O_CREAT, 0777) // 不存在则创建app.c文件,权限设置为0777异或umask
参数pathname:待打开/创建文件的POSIX路径名(如/home/user/a.cpp)
参数flags: 用于指定文件的打开/创建模式
参数:mode 创建文件的权限。 //在创建文件时需要有权限的参数;如果打开文件,则不需要这个参数
flsgs参数:
O_RDONLY只读模式
O_WRONLY只写模式
O_RDWR读写模式
打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:
O_APPEND每次写操作都写入文件的末尾
O_CREAT如果指定文件不存在,则创建这个文件
O_EXCL如果要创建的文件已存在,则返回-1,并且修改errno的值
O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O
mode参数:
创建文件时文件权限 == mode 异或 umask
文件描述符概述:
内核的一个重要功能是文件管理,系统有非常多的文件,内核怎样认识每一个文件呢?内核采用ID号的方式标识这些文件,inode号,node号表示不同的文件,比如ls –lai i,只要文件不一样,inode号就不一样。那么这些内核的文件的ID号,在每个用户的程序中怎样映射的呢?即是文件描述符。
ID号有什么规律呢?从0开始累加,程序进行时(进程),内核会自动打开3个文件描述符,0,1,2,分别对应,标准输入、输出和出错,这样在程序中,每打开一个文件,文件描述符值从3开始累加。
close函数
Close(windowname)//函数原型
//例子如下
Close(fd) //关闭文件windowname
参数windowname:要关闭窗口的名称返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数windowname的值为NULL,Close()函数返回NULL。
调用close()函数可以关闭一个打开的文件。
调用成功返回0,出错返回-1,并设置errno;
注:当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
write函数
write(int fd, void *buf, size_t count ) // 函数原型
//例子如下
cnt = wirte(fd, buff, srtlen(buff)); //从buff里读取数据向fd文件写入strlen(buff)个字节,
参数fd:向哪一个文件中去写
参数buf:向这个文件中写什么内容
参数size:向这个文件中写多少个字节。
返回值:是实际写的字节数。
read函数
read(int fd, void *buf, size_t count)//函数原型
//例子如下
cnt = read(fd, buff, 10)//向文件fd读取10个字节存入到buff中,cnt返回实际读到的字节个数
参数fd:从哪一个文件中去读
参数buf:读到什么地方去
参数count:读多少个。
返回值:是实际读的字节数
lseek函数
//包含的头文件
#include<sys/types.h>
#include<unistd.h>
//函数原型
off_t lseek(int fd,off_t offset ,int whence);
//例子如下
lseek(fd, 0, SEEK_SET); //指向发文件的开头,偏移量为0,
参数fd:要调整的文件的文件描述符;
参数offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移);
参数whence:当前位置的基点,有三个标志
whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).
SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现
返回值:成功:文件当前的位置,出错:-1
函数open() close() write() read()例子
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
int fd;
char buff[30] = {0};
sprintf( (char *)buff, "/home/c/C/File/%s", argv[1]);
fd = open(buff,O_CREAT | O_RDWR, 0777 );
if(fd == -1)
{
fprintf(stderr, "file fail\n");
return -1;
}
printf("file %s_%d is successfully ! \n", argv[1], fd);
int wt_cnt = 0;
wt_cnt = write(fd, buff, strlen(buff));
printf("writed num:%d\n", wt_cnt);
lseek(fd, 0, SEEK_SET);
int rd_cnt = 0;
char c;
memset(buff, 0, sizeof(buff) );
while(read(fd, &c, 1)>0 )
{
printf("%c", c);
}
printf("read:ok\n");
close(fd);
return 0;
}
参考:https://blog.csdn.net/wenwen111111/article/details/57412477