i o 设备在linux中被当作啥文件,linux基础复习(6)文件I/O操作

不带缓存的文件I/O 操作,主要用到5 个函数:open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数(不理解这句话的含义)。这些函数虽然不是ANSI C的组成部分,但是是POSIX 的组成部分。本文引用地址:http://www.eepw.com.cn/article/201610/305800.htm

open函数语法要点

|-- #i nclude // 提供类型pid_t的定义

所需头文件----|-- #i nclude

|-- #i nclude

函数原型 int open(const char *pathname,flags,int perms)

pathname 被打开的文件名(可包括路径名)

O_RDONLY:只读方式打开文件

O_WRONLY:可写方式打开文件

O_RDWR:读写方式打开文件

O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限

O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一

函数传入值 参数可测试文件是否存在

O_NOCTTY:使用本参数时,如文件为终端

终端不可用open()系统调用的那个进程的控制终端

O_TRUNC:如文件已经存在,并且以只读或只写成功打开,那么会先

全部删除文件中原有数据

O+APPEND:以添加方式打开文件,在打开文件的同时,文件指针指

向文件的末尾

perms 被打开文件的存取权限,为8进制表示法

函数返回值 成功:返回文件描述符

失败:-1

补述:文件描述符

对于Linux 而言,所有对设备和文件的操作都使用文件描述符来进行的。文件描述符

是一个非负的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一

个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,

也需要把文件描述符作为参数传递给相应的函数。

通常,一个进程启动时,都会打开3 个文件:标准输入、标准输出和标准出错处理。这

3 个文件分别对应文件描述符为0、1 和2(也就是宏替换STDIN_FILENO、STDOUT_FILENO

和STDERR_FILENO)。

基于文件描述符的I/O 操作虽然不能移植到类Linux 以外的系统上去(如Windows),但它

往往是实现某些I/O操作的惟一途径,如Linux中低级文件操作函数、多路I/O、TCP/IP套接字

编程接口等。同时,它们也很好地兼容POSIX标准,因此,可以很方便地移植到任何POSIX平

台上。基于文件描述符的I/O操作是Linux中最常用的操作之一。

read函数语法要点

所需头文件 #i nclude

函数原型 ssize_t read(int fd,void *buf,size_t count)

fd:文件描述符

函数传入值 buf:指定存储器读出数据的缓函数传入值 冲区

count:指定读出的字节数

成功:读到的字节数

函数返回值 0:已到达文件尾

-1:出错

write函数语法要点

所需头文件 #i nclude

函数原型 ssize_t write(int fd,void *buf,size_t count)

fd:文件描述符

函数传入值 buf:指定存储器写入数据的缓函数传入值 冲区

count:指定读出的字节数

函数返回值 成功:已写的字节数

-1:出错

lseek函数语法要点

所需头文件 #i nclude

#i nclude

函数原型 off_t lseek(int fd,off_t offset,int whence)

fd:文件描述符

函数传入值 offset:偏移量,每一读写操作所需要移动的距离

单位是字节的数量,可正可负(向前移,向后移)

whence: SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小

当前位置 SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移

的基点 SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移

函数返回值 成功:文件的当前位移

-1:出错

/*打开,关闭,读写文件.c*/

#i nclude unistd.h>

#i nclude sys/types.h>

#i nclude sys/stat.h>

#i nclude fcntl.h>

#i nclude stdlib.h>

#i nclude stdio.h>

int main(void)

{

int fd; //文件描述符

int i,size,len;

char *buf=Writing to this file!;

char buf_r[10];

len = strlen(buf);

/*调用open函数,以可读写的方式打开,注意选项可以用“|”符号连接*/

if((fd = open(/tmp/hello.c, O_CREAT | O_TRUNC | O_WRONLY , 0600 ))0){

perror(open:);

exit(1);

}

else{

printf(Open file: hello.c %d\n,fd);

}

/*调用write函数,将buf中的内容写入到打开的文件中*/

if((size = write( fd, buf, len)) 0){

perror(write:);

exit(1);

}

else

printf(Write:%s\n,buf);

/*调用lsseek函数将文件指针移到文件起始,并读出文件中的10个字节*/

lseek( fd, 0, SEEK_SET );

if((size = read( fd, buf_r, 10))0){

perror(read:);

exit(1);

}

else

printf(read form file:%s\n,buf_r);

if( close(fd) 0 ){

perror(close:);

exit(1);

}

else

printf(Close hello.c\n);

exit(0);

}

当多个用户共同使用、操作一个文件的情况,这时,Linux 通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。

文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。在Linux 中,实现文件上锁的函数有lock和fcntl,其中flock用于对文件施加建议性锁,而fcntl不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值