Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247772
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2012-03-02 10:34:34

open 函数

 #include

      #include

      #include

      int open(const char *pathname, int oflag, …/*, mode _t mode * / ) ;

      功能:打开文件

      返回: 若成功为文件描述符,若出错为 -1,出错时errno被设置

pathname 是要打开或创建的文件的名字。

      oflag 参数可用来说明此函数的多个选择项。

      对于 open 函数而言 ,仅当创建新文件时才使用第三个参数。

      : 三参数 … , I S O C 表示参数类型和个数不定 .

oflag 值:

O_R DONL Y只读打开

O_WRONL Y只写打开     此三者必选其一

O_R D WR读、写打开

 

O_APPEND每次写时都加到文件的尾端

 

O_CR EAT若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode ,用其说明该新文件的存取许可权位

 

O_EX CL:如果同时指定了 O_CR EAT ,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作

 

O_TRUNC如果此文件存在,而且为只读或只写成功打开,则将其长度截短为 0

 

O_NOCTTY如果 pathname 指的是终端设备,则不将此设备分配作为此进程的控制终端

 

O_NON BLOCK:如果 pathname 指的是一个 FIFO 、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的 I / O 操作设置非阻塞方式

 

O_SYNC使每次 write 都等到物理 I / O 操作完成

 

MODE

S_ I RWX U

用户主的读写和 执行权

S_ I RU SR

用户读

S_ I W USR

S_ I X USR

用户写

用户 执行

S_ I RWXG

组的读写

S_ I RGRP

组读

S_ I WGRP

组写

S_ I XGRP

组执

S_ I RWX O

其它 人的读写

S_ I ROTH

其它 人读

S_ I W OTH

其它 人写

S_ I X OTH

其它 执行

 

creat 函数

# include

       # include

       # include

       int creat(const char * pathname, mode _ t mode) ;

       功能: 创建一个新的文件。

       返回: 若成功为 写打开的文件描述符, 若出错为 - 1

              注意,此函数等效于:. open (pathname, O _WR ONL Y | O _CR EAT | O_TRUNC, mode) ;

              creat 的一个不足之处是它以只写方式打开所创建的文件。

 

close 函数

# include

    int close (int filedes)

    功能:关闭一个打开文件

    返回: 若成功为0 ,若出错为 - 1

    当一个进程终止时,它所有的打开文件都由内核自动关闭。很多程序都使用这一功能而不显式地用close关闭打开的文件。

 

lseek 函数

每个打开文件都有一个与其关联的当前文件偏移量。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作从当前文件偏移量处开始,并使偏移量增加所读或写的字节数。按系统默认 ,当打开一个文件时,除非指定O _APP END 选择项,否则该位移量被设置为 0

       可以调用 lseek 显式地定位一个打开文件。

       # include

       # include

       off _ t lsee k (int filesdes, off _t offset, int whence) ;

       功能:设置文件内容读写位置

       返回: 若成功为新的文件位 ,若 出错为 - 1

       对参数 offset 的解释与参数 whence 的值 有关。

       whenceSEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。

       whenceSEEK_CUR,则将该文件的位移量设置为其当前值加offsetoffset 可为正或负。

       whence SEEK_END,则将该文件的位移量设置为文件长度加 offsetoffset 可为正或负。

 

read 函数

         #include

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

              功能: 从打开文件中读数据

              返回:读到的字节数,若已到文件尾为0,若出错为- 1

       有多种情况可使实际读到的字节数少于要求读字节数:

       读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回 3 0 ,下一次 再调用read时,它将返回0(文件尾端)。当从终端设备读时,通常以行为单位,读到换行符就返回。

       当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。

       某些面向记录的设备,例如磁带,一次最多返回一个记录。

       读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读得的字节数。

 write 函数

       #include

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

       功能;向打开文件写数据。

       返回:若成功为已写的字节数,若出错为-1

       其返回值通常与参数count的值不同,否则表示出错。write出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。

       对于普通文件,写操作从文件的当前位移量处开始。如果在打开该文件时,指定了O_APP END选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处。在一次成功写之后,该文件位移量增加实际写的字节数。

 

pread & pwrite 函数

       ssi ze_t pread(int filedes, void *buffer, size_t size, off _t offset)

       ssi ze_t pwrite(int filedes, const void *buffer, size_t size, off _t offset)

       类似于readwrite,只是读写不是从文件当前位置开始,而是从offset位置开始,并且函数执行完后也不影响当前文件指针位置,即指针位置不改变。

 

fcntl 函数

                     #include

                     #include

                     int fcntl(int filedes, int cmd, ... ) ;

                     功能:改变已经打开文件的性质

                     返回:若成功则依赖于cmd(),若出错为-1

       fcntl 函数有五种功能:

              复制一个现存的描述符,新文件描述符作为函数值返(cmdF_DUPFD)。

              获得/设置文件描述符标记,对应于filedes的文件描述符标志作为函数值返回.(cmd=F_GET FDF_SETFD)。

              获得/设置文件状态标志,对应于filedes的文件状态标志作为函数值返回。(cmd=F_GETFLF_SETFL)。

              获得/设置异步I/Ocmd=F_GETOWNF_SETOWN)。

              获得/设置记录锁(cmd=F_SETLK,F_SETLKW

 

文件状态 

标志说明

O _R DONL Y

只读打开

O _WR ONL Y

只写打开

O _R D WR

/ 写打开

O_APP END

写时都添加至文件尾

O _ NON B LOC K

非阻塞方式

O _SY NC

等待写完成

O _ASY NC

异步 I / O

 

ioctl 函数

       ioctl函数是I /O操作的杂物箱。不能用本章中其他函数表示的I/O操作通常都能用ioctl表示。终端I/Oioctl的最大使用方面,主要用于设备的I/O控制。

              #include

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

              返回:若出错则为-1,若成功则为其他值。

       例如:串口线上传送的数据通过readwrite来操作,而串口的波特率、校验位、停止位可以通过ioctl来设置。

 

测试文件类型

   类型,即文件的分类(例如:它是一个普通文件,还是符号链接,还是某种特殊文件)

       使用 stat 函数取得文件的状态信息以进行测试

       #include

       int stat(const char * path, struct stat *sbuf);

       stat提供有关文件的丰富信息,包括大小、所有者、组、最后修改时间等。

       int fstat(int fd, struct stat *sbuf);

       fstat功能和stat相同,只是通过文件描述符来进行操作,而不是通过文件名。

       函数出错返回 -1 ,否则返回 0

 

struct stat 结构

       struct stat {

              mode_t st_mode; // 文件对应的模式,文件, 目录等

              ino_t st_ino; //inode 节点号

              dev _t st_dev; // 设备号

              dev _t st_rdev; // 特殊设 备号

              nlink_t st_nlink; // 文件的连接数

              uid _t st_uid; // 文件所 有者

              gid_t st_gid; // 文件所 有者 对应的组

              off_t st_siz e; // 普通文件,对应的文件字节数

              time_t st_atime; // 文件最后被访问的时间

              time_t st_mtime; // 文件内容 最后被修改的时间

              time_t st_ctime; // 文件状态改变时间

              blksiz e_t st_blksiz e; // 文件内容对应的块 大小

              blkcnt_t st_blocks; // 文件内容对应的块数量

     

 

stat 进行文件测试的宏

       S_ I S DIR(sbuf.st _mode)

说明 ( 如果文件是该类型则返回

1 ,否则返回 0)

S_ ISREG

普通文件

S_ ISDIR

目录

S_ ISCHR

特殊字符文件

S_ ISBL K

特殊块文件

S_ ISLNK

符号链接

S_ ISFIFO

特殊 FIFO 文件

S_ ISSOCK

套接字

 

相关函数

       struct passwd *getpwuid(uid _ t uid);

       Get User Information for User ID.

       #include

       struct passwd * pwd = getpwuid(statbuf.st _uid);

       if(pwd) printf(“File Ower: %s \n”, pwd->pw _name);

 

       struct group *getgrgid(gid _t gid);

       Get Group Information Using Group ID.

       #include

       struct group * grp = getgrgid(statbuf.st _gid);

       if(grp) printf(“File Group: % s \n”, grp->gr _name);

确定当前工作目录

char *getcwd(char *buf, si ze_t siz e); //G et Current Director y.

long pathconf(const char *path, int name); //G et Configurable Path Name Variables.

char * get_current_dir _name(void); // getcwd(NULL, 0)

int chdir (const char *filename); //set the process ’s working directory to filename

int fchdir (int filedes);  //set the process’s working directory to directory associated with the file descriptor filedes.

# include

long maxpathlen = pathconf(“.”,_PC _PATH_MAX);  //获取路径最大长度

char * pathname = (char *)malloc(maxpathlen);

getcwd(pathname, (si z e_t)maxpathlen);

printf(“ %s\n”,pathname);

 

列举目录

DIR *opendir(const char *dirname); //Open Directory

DIR * fdopendir(int fd);

struct dirent *readdir(DI R *dirp); //Read Directory Entry

int closedir(DI R *dirp); //Close Directory

void rewinddir(DI R *dirstream); //reinitiali ze the directory stream dirstream

long int telldir(DI R *dirstream);  //returns the file position of the directory stream dirstream.

void seek dir(DI R *dirstream, long int pos); //sets the file position of the director y stream dirstream to pos.

       # include

       # include

       # include

       int main(void)

       {

              DI R *dp;

              struct dirent *ep;

              dp = opendir("./");

              if(dp != NULL)

              {

                     while(ep = readdir(dp))

                            puts(ep->d_name);

                     closedir(dp);

              } else

                     perrory ("Couldn 't open the directory");

      return 0;

    }

 

使用 inotify 进行文件事件通知

    内核 2 .6 的新特点之一就是支持文件系统事件通知,这个新机制名为inotify,表明它提供的是inode事件的通知。

       Beagle 搜索工具使用inotif y自动地把文件系统的改变通知执行索引,这样就避免了周期性的扫描文件系统的改变,从而提高效率。

       #include

       int inotif y_init(void)

       int inotif y_add _watch(int fd, const char* pathname, int mas k )

       int inotif y_rm _watch(int fd, int wd)

 

从文件系统删除文件

    #include

       int remove(char * filename)

       功能:从文件系统中删除文件,不管是文件还是目录都行。是文件时同unlink,是目录时同rmdir

       成功返回 0 ,失败返回 -1

阅读(1335) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~