Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1754154
  • 博文数量: 600
  • 博客积分: 10581
  • 博客等级: 上将
  • 技术积分: 6205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 10:13
文章分类
文章存档

2016年(2)

2015年(9)

2014年(8)

2013年(5)

2012年(8)

2011年(36)

2010年(34)

2009年(451)

2008年(47)

分类: LINUX

2009-08-22 13:07:24

mknod( )

UNIX系统中,create,open只能建立一般文件。要创建目录,管道,设备文件,就要使用mknod()

 

[格式]

# include

 

int mknod(char *path,mode_t type_and_mode,dev_t devnum)

 

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

 

[说明]

 

path                  文件名。

Type_and_mode     文件类型和存取权限,是一个16位的整数,08位为文件的访问权限,911为文件执行方式,12 15为文件类型,支持文件的类型和权限如下:

 

#  define    S_IFMT            0170000       /*文件类型掩码*/

#  define      S_IFDIR           0040000       /*目录*/

#  define      S_IFOHR         0020000       /*字符特殊文件*/

#  define      S_IFREG          0100000       /*一般文件*/

#  define      S_IFBLK           0060000       /*块特殊文件*/

#  define      S_IFIFO           0010000       /*命名管道*/

#  define      S_ISUID           0004000       /*用户ID*/

#  define      S_ISGID           0002000       /*ID*/

#  define      S_ISVTX          0001000       /*粘着位*/

 

!         EXAMPLE:

If(mknod(pipefilename,0010644,0010000)<0){

           Fprintf(stderr,”can’t make pipe \n”);

           Exit (-1);

}

 

statfstat lstat 函数

本章讨论的中心是三个s t a t函数以及它们所返回的信息。

#include

#include

int stat(const char * p a t h n a m e, struct stat * b u f) ;

int fstat(int f i l e d e s,struct stat * b u f) ;

int lstat(const char * p a t h n a m e, struct stat * b u f) ;

 

三个函数的返回:若成功则为0,若出错则为-1

给定一个p a t h n a m es t a t函数返回一个与此命名文件有关的信息结构, f s t a t函数获得已在描述符f i l e d e s上打开的文件的有关信息。l s t a t函数类似于s t a t,但是当命名的文件是一个符号连接时,l s t a t返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。

第二个参数是个指针,它指向一个我们应提供的结构。这些函数填写由b u f指向的结构。

该结构的实际定义可能随实现而有所不同,但其基本形式是:

struct  stat {

              mode_t    st_mode;

              ino_t          st_ino;

              dev_t       st_dev;

              dev_t         st_rdev;

              nlink_t      st_nlink;

              uid_t           st_uid;

              gid_t           st_gid;

              off_t           st_size;

              time_t         st_atime;

              time_t         st_mtime;

              time_t         st_ctime;

              long           st_blksize;

              long     st_blocks;

};

 

 

存取許可权测试 access()

[格式]

 

# i n c l u d e < u n i s t d . h >

int access(const char * p a t h n a m e, int m o d e) ;

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

           access函数的m o d e常数,取自< u n i s t d . h >

m o d e 说明

R _ O K 测试读许可权

W _ O K 测试写许可权

X _ O K 测试执行许可权

F _ O K 测试文件是否存在

 

 

文件截短  int truncate(const char * p a t h n a m e, off_t l e n g t h)

有时我们需要在文件尾端处截去一些数据以缩短文件。将一个文件的长度截短为0是一个

特例,用O _ T R U N C标志可以做到这一点。

为了截短文件可以调用函数t r u n c a t ef t r u n c a t e

[格式:]

#include

#include

 

int truncate(const char * p a t h n a m e, off_t l e n g t h) ;

int ftruncate(int f i l e d e s, off_t l e n g t h) ;

两个函数返回;若成功则为0,若出错则为-1

 

这两个函数将由路径名p a t h n a m e或打开文件描述符f i l e d e s指定的一个现存文件的长度截短为l e n g t h。如果该文件以前的长度大于l e n g t h,则超过l e n g t h以外的数据就不再能存取。如果以前的长度短于l e n g t h,则其后果与系统有关。如果某个实现的处理是扩展该文件,则在以前的文件尾端和新的文件尾端之间的数据将读作0 (也就是在文件中创建了一个空洞)

 

Getcwd( )

我们需要一个函数,它从当前工作目录开始,找到其上一级的目录,然后读其目录项,直

到该目录项中的i节点编号数与工作目录i节点编号数相同,这样地就找到了其对应的文件。按

照这种方法,逐层上移,直到遇到根,这样就得到了当前工作目录的绝对路径名。函

g e t c w d就是提供这种功能的。

 

# i n c l u d e < u n i s t d . h >

char *getcwd(char * b u f, size_t s i z e);

 

返回:若成功则为buf, 若出错则为N U L L

 

向此函数传递两个参数,一个是缓存地址b u f,另一个是缓存的长度s i z e。该缓存必须有足够的

长度以容纳绝对路径名再加上一个n u l l终止字符,否则返回出错

chdir,fchdir

[功能:]  改变工作目录

 

[格式:]

include

int chdir(const char * p a t h n a m e) ;

int fchdir(int f i l e d e s) ;

两个函数的返回:若成功则为0,若出错则为-1

在这两个函数中,可以分别用p a t h n a m e或打开文件描述符来指定新的当前工作目录。

 

 fopen ( ) fclose( ), fgets( ), fgetc( ), feof( ), fflush( ), fscanf( )

[格式:]

FILE * fopen( const char * filename, const char *mode)   成功返回文件句柄,否则返回NULL

fclose( FILE *fp)

int feof(FILE * fp)         到达文件尾则返回真值,否则返回0

char*   fgets( char * str,int length,FILE *fp)     成功返回str 值,否则返回NULL (说明:新行符也被读入串)从文件中读串到字符串中。

int fputs( const char *str,FILE *fp)        出错时返回EOF

 

 

 

         ---------------------------Mode ----------------------------------------

         方式                   意义

         r                           read文本文件

         w                         write 文本文件

         a                          append文本文件

         rb                        read and open 二进制文件

         wb                       write and create 二进制文件

         ab                       append   二进制文件

         r+                        读写打开文本文件

         w+                       读写生成文本文件

         a+                       向文本读写文件追加

         r+b                      读写打开二进制文件

         w+b                    读写生成二进制文件

         a+b                     向二进制读写文件追加

         -----------------------------------------------------------------------------

1à

FILE *fp;

If((fp=fopen(“test”,”w”))==NULL){

fprintf(stderr,”can’t open file”);

         return –1;

while(fgets(buf,200,fd)!=NULL){

          …………

}

fclose(fd);

 

2à

char ch;

while(!feof(fd)){

          ch=getc(in);

}

 

sscanf,sprintf

# include

int sscanf(char * buf,const char *control_string,………..)      成功返回后面跟的 control string 个数。

将字符串输入到若于变量中。

Int  sprintf(char *buf ,const char * control_string ,…………)

        将变量转为字符串。

 

!       EXAMPLE:

一个读文件的例子

         # include

         # include

         # include

         # include

         # include

         # include

 

         test( char bb[5][50]){

                   int j;

                   for (j=0;j<5;j++){

                            fprintf(stderr,bb[j]);

                   }

         }

 

         main()

         {

                   char filename[50];

                   char buf[50];

                   int I,readlen;

                   char buff[5][50];

 

                   FILE *fd;

                   Strcpy(filename,(char *)getenv(“ENV”) ;   /* ENV NUM */      /**get env */

                   Strcat(filename,”/etc/hostip.ini”);

                   Fprintf(stderr,filename);

                   If(fd=fopen(filename,”r+”))==NULL){                         /* open the file*/

                            Fprintf(stderr,”open host.ini is error\n”);

                            Exit(-1);

                   }

                   for(I=0;!feof(fd);I++){  

                            fgets(buf,50,fd);                /*   get string from fd to buf*/

                            if(buf[0]==’#’){

                                     continue;

                            }

                            else

                                     strcpy(buff[I],buf);

                   test(buff);

         }

   

   

FILE * fd;

Fd=fopen(filename ,r+)

Fd 不能作参数来传递

: open_file(FILE *fd)        FILE *fd 作为参数

 

但我们可以用FILE 作为返回值

:

FILE * open_file()

{

      FILE *fd;

      Fd=fopen();

}

 

main()

{

      FILE *fd;

      Fd=open_file();

……………….

}

 

 

 

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