无缓冲区的I/O操作

2019-07-08  本文已影响0人  suntwo

文件描述符

文件描述符是一个非负的小整数,当我们创建或者打开文件时,内核便会返回一个文件描述符,来标识这个打开或者创建的文件。

标准输入,标准输出,标准错误

当我们开启一个进程时会自动打开这三个描述符,STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO这三个宏定义的描述符分别为0,1,2。这些通常是在unistd.h中定义的。我们可以通过这些描述符进行从终端来进行输入输出操作。

#include<stdio.h>
#include<unistd.h>
int main()
{
char a[10];
read(STDIN_FILENO,a,10);
write(STDOUT_FILENO,a,20);
}

无缓冲的函数

我们这节主要介绍的是无缓冲的I/O函数,无缓冲表示这些函数都是系统调用,我们在讨论原子的操作的时候无缓冲的函数是很重要的。

open函数

函数原型

#include<fcntl.h>
int open(const char *path,int oflag /, mode_t mode/);
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int fp = open("aa.txt",O_WRONLY|O_APPEND);
char a[10]="dsdsdfs";
write(fp,a,strlen(a));
printf("%s",a);
}
测试:
root@ubuntu:/home/sun/project# cat aa.txt
dsjfskjfsds
fdssdjk

dsdsdfs
dsdsdfs111111root@ubuntu:/home/sun/project# 
将内容添加到文件末尾

read函数

函数原型

#include<unistd.h>
ssize_t read(int fd,void *buf,size_t nbytes);
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
char a[100];
read(STDIN_FILENO,a,10);
printf("%s",a);
}

测试:
root@ubuntu:/home/sun/project# ./test
gfdjhskjalksaldsasfjediskkasjdkdndfcska
gfdjhskjal<root@ubuntu:/home/sun/project# ksaldsasfjediskkasjdkdndfcska
ksaldsasfjediskkasjdkdndfcska: command not found
可以看到当我们输入的字符数大于读取的字符数时,只是读取了我们要求的字符数10,剩余的字符数没有被读取。我们可以将我们从终端的输入看作是一个文件,read函数从终端这个文件中读取指定数目的字符。
eg:
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
char a[10];
read(STDIN_FILENO,a,20);
printf("%s",a);
}
测试:
root@ubuntu:/home/sun/project# ./test
1234567890122345
1234567890122345
�Fl�root@ubuntu:/home/sun/project# 
可以看到当我们输入的字符数大于我们的缓冲区时便会出现错误。

write函数

函数原型

#include<unistd.h>
ssize_t write(int fd,const void *buf,size_t nbytes);

close函数

这个函数表示关闭打开的文件

lseek函数

每打开一个文件便会返回一个文件描述符,但是内核会维护一个文件偏移量,正常打开文件文件偏移量为0,但是当我们使用O_APPEND时便会将文件偏移量指向最后一个字符,我们的读写操作都是从文件偏移量的位置开始的,当我们读取或写入一个字节,文件的偏移量也会增加1,lseek这个函数便是来操作文件偏移量的,可以使用lseek函数来操作我们想要从任意位置的读写位置。

函数原型

#include<unistd.h>
off_t lseek(int fd,off_t offset,int whence)
返回值:成功返回文件的新的偏移量,失败返回-1

参数解释

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
int main()
{
int fd=open("aa.txt",O_RDONLY);
int a=lseek(fd,2,SEEK_SET);
char buf[10];
read(fd,buf,10);
printf("%d     %s",a,buf);

}

文件共享

我们可以在多个进程之间打开同一个文件,我们将介绍多个进程同时操作同一个文件时相互产生的影响。

20130912202531765.png
上一篇 下一篇

猜你喜欢

热点阅读