分类: LINUX
2009-08-22 13:07:24
在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位为文件的访问权限,9,11为文件执行方式,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);
}
本章讨论的中心是三个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 e,s 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;
};
[格式]
# 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 测试文件是否存在
有时我们需要在文件尾端处截去一些数据以缩短文件。将一个文件的长度截短为0是一个
特例,用O _ T R U N C标志可以做到这一点。
为了截短文件可以调用函数t r u n c a t e和f 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 (也就是在文件中创建了一个空洞)。
我们需要一个函数,它从当前工作目录开始,找到其上一级的目录,然后读其目录项,直
到该目录项中的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终止字符,否则返回出错
[功能:] 改变工作目录
[格式:]
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或打开文件描述符来指定新的当前工作目录。
[格式:]
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);
}
# 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(); ………………. } |