UNIX环境高级编程---------文件IO

UNIX环境高级编程---------文件IO
一 .    文件IO
定义:文件IO又叫低级IO-------操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。
专业点的叫法就是不带缓存的IO,这里的不带缓存指的是每个read和write都调用内核中的一个系统调用。
      
二.文件IO的操作
文件描述符:文件io打开文件的标识非负整型数,是内核为打开文件维护结构的数组下标默认最多能打开1024文件
stdin-----0
stdout-----1
stderr-----2
,,
(1)  open

头文件

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

函数

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

功能说明

两者都是用来打开或者创建文件,在打开或创建文件时可以制定文件的属性及用户的权限等各种参数。

需要注意的是:三参模式一般用于新建的文件

参数说明

参数 pathname 指向欲打开的文件路径字符串.

参数flags :打开文件后,所赋予的权限,选择时,可在下面的三者中选择一种(只可以是其中一种):

O_RDONLY 以只读方式打开文件

O_WRONLY 以只写方式打开文件

O_RDWR 以可读写方式打开文件.

除了上述三种选择外:还可以使用 | 与下面选项配合使用

O_CREAT 若欲打开的文件不存在则自动建立该文件.

O_EXCL 如果O_CREAT也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.

O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机.

O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.

O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面.

O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待, 都会立即返回进程之中.

O_NDELAY 同O_NONBLOCK.

O_SYNC 以同步的方式打开文件.

O_NOFOLLOW 如果参数pathname所指的文件为一符号连接, 则会令打开文件失败.

O_DIRECTORY 如果参数pathname所指的文件并非为一目录, 则会令打开文件失败。

Mode:设置文件访问权限的初始值;只有在建立新文件时才会生效, 此外真正建文件时的权限会受到umask 值所影响, 因此该文件权限应该为 (mode-umaks).

该选项有如下的选择:

S_IRWXU 00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.

S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限.

S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限.

S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限.

S_IRWXG 00070 权限, 代表该文件用户组具有可读、可写及可执行的权限.

S_IRGRP 00040 权限, 代表该文件用户组具有可读的权限.

S_IWGRP 00020 权限, 代表该文件用户组具有可写入的权限.

S_IXGRP 00010 权限, 代表该文件用户组具有可执行的权限.

S_IRWXO 00007 权限, 代表其他用户具有可读、可写及可执行的权限.

S_IROTH 00004 权限, 代表其他用户具有可读的权限

S_IWOTH 00002 权限, 代表其他用户具有可写入的权限.

S_IXOTH 00001 权限, 代表其他用户具有可执行的权限.

 


(2)  read

头文件

#include <unistd.h>

函数

ssize_t   read(int fd, void *buf, size_t count);                                                                                                                                                                                       

功能说明

read系统调用从文件描述符fd指向的文件中,读取count个字节到buf中。

返回值:如果read成功,则返回读到的字节数,如果已达到结尾,则返回0,出错返回-1

参数说明

fd:文件描述符          

buf:保存读入信息的缓存       

count:要读取的字节数                     


(3)write

头文件

#include <unistd.h>

函数

ssize_t       write(int fd, const void *buf, size_t count);

功能说明

write系统调用将buf所指向的缓冲区的count个字节内容写入fd指向的文件

返回值:如果write成功,则返回读到的字节数,出错返回-1

参数说明

fd:文件描述符                                                                                                                                                                                                                                            

buf:保存读入信息的缓存       

count:要读取的字节数                     


(4)close

头文件

#include <unistd.h>                                                                                                                                                                                                                                    

函数

int close(int fd);

功能说明

(1)  当使用完文件后若已不再需要则可使用 close()关闭该文件;

(2)   close()会让数据写回磁盘,并释放该文件所占用的资源.返回值:若文件顺利关闭则返回0, 发生错误时返回-1.

参数说明

参数fd 为先前由open()或creat()所返回的文件描述词.

注意:在进行IO操作的时候,应遵从谁打开谁关闭open()和close() / fopen()和fclose()应成对出现


(5)lseek

头文件

#include <sys/types.h>

#include <unistd.h>                                                                                                                                                                                                                                    

函数

off_t lseek(int fd, off_t offset, int whence);

功能说明

lseek系统调用用来移动读写指针的位置

返回值:调用成功时范围当前的读写位置,也就是距离文件开始处多少字节,若有错误返回-1

参数说明

fd:要操作的文件         

offset:相对whence移动的位移数,允许负值          

whence:起始指针,它有三个取值       

SEEK_SET 从文件开始处计算偏移量             

SEEK_CUR 从文件指针的当前位置开始计算偏移量            

SEEK_END 从文件结尾处开始计算偏移量文件指针值等于当前指针值加上offset的值。        

将文件读写指针移动到文件开头:lseek(int fildes, 0, SEEK_SET);

将文件读写指针移动到文件结尾:lseek(int fildes, 0, SEEK_END);         

获取文件读写指针当前的位置lseek(int fikdes, 0, SEEK_CUR);

<1>允许偏移的字节个数大于文件本身

<2>lseek()本身不进行读写操作

(5)dup()/dup2()

头文件

#include <unistd.h>

函数

int dup(int oldfd);

int dup2(int oldfd, int newfd);

功能说明

两者均是用来实现文件的重定向文件描述符;但是有一定区别

(1)    dup是非原子操作/dup2是原子操作

(2)   

(1)   dup:传给该函数一个既有的描述符oldfd,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。

(3)    dup2 dup函数相似,但dup2函数允许调用者规定一个有效描述符oldfd和目标描述符的newfddup2函数成功返回时,目标描述符newfd将变成源描述符oldfd的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。

参数说明

参数fd 为先前由open()或creat()所返回的文件描述词.



(6)刷新内核缓存

头文件

#include <unistd.h>

函数

Void   sync(void);

int     fsync(int fd);

int     fdatasync(int fd);

功能说明

sync(2);//刷新缓存区到内核io队列,不阻塞  ;

fsync(2);//阻塞,直到文件的数据和inode信息全部刷新在磁盘空间才会返回;     成功返回0,错误返回-1 并设置errno

fdatasync(2);//阻塞,只是文件的数据刷新在磁盘空间才会返回;

成功返回0,错误返回-1 并设置errno

参数说明

参数fd 为先前由open()或creat()所返回的文件描述词.

(7) fcntl()

头文件

#include <unistd.h>

#include <fcntl.h>                                                                                                                                                                           

函数

int      fcntl(int fd, int cmd, ... /* arg */ );

功能说明

功能描述:根据文件描述词来操作文件的特性。

参数说明

参数:   
fd
:文件描述词。 
cmd:操作命令。 
arg:供命令使用的参数。 
lock:同上。

(7)io ctl()

头文件

#include <sys/ioctl.h>

函数

int ioctl(int d, int request, ...);

功能说明

ioctl设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制;

参数说明

d就是用户程序打开设备时使用open函数返回的文件标示符;

request就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和request的意义相关的。



老规矩,最好做一个总结的例子:
/********************************************/
//创建一个新的文件,将标准输入重新定向到新创建的文件,
//使用write()想标准输入连续写入"LINUX 菜鸟\n",发现结果实际上是写到了新创建的文件fd中
/********************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <stdlib.h>


int main(int argc,char **argv)
{
int fd,new;//定义一个文件描述符
char buf[1024] = "LINUX 菜鸟\n";
int i = 0;
if(argc <2){
printf("Useage.....");
exit(1);
}


fd = open(argv[1],O_WRONLY|O_CREAT,0666);  //赋予创建/打开的文件权限
if(fd < 0){
perror("open()");
exit(1);
}
if((new = dup2(fd,1)) < 0){
perror("dip2()");
exit(1);
}

for(i=0;i<6;i++){
write(1,buf,1024); //向输出stout流输入字节
}


close(fd);   //遵守谁打开谁关闭的原则
return 0;
}











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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值