linux 下的c 文件操作

来源:互联网 发布:刘备是汉室宗亲吗 知乎 编辑:程序博客网 时间:2024/05/01 15:11

看了几天的linux c编程实战,感觉挺难的,跟windows下的文件操作完全不一样。

例如:linux下有文件的权限:linux是面向多用户的系统,所以权限使其文件安全性得到保证。

linux的文件操作不止可以用文件指针(指向FILE结构体,这是一个typedef后的结构体),而且可以用文件描述符,是int类型的变量(这是linux和unix独有的)。

还有很多。。。。这里就不一一列举。

此次写博客,主要是为了把这几天所学的内容复习一遍。



创建文件(open,creat,umask,read,write):

#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)

pathname是打开或创建文件的路经,而flags是表示打开文件的方式,参数有:

O_RDONLY :以只读方式打开。

O_WRONLY:以只写方式打开。

O_RDWR:可读可写方式打开。

他们在fcntl.h中有定义:

#define O_RDONLY               1

#define O_WRONLY               2

#define O_RDWR                    4

以上三种方式的打开是互斥的,但他们可以与以下的几种标志进行或运算。

#define  O_CREAT                  0x0100   文件不存在则创建文件,此时要用到第三个参数mode

#define  O_TRUNC                 0x0200   文件存在而且以可写打开,则將文件清除,重建一个新文件。

#define  O_EXCL                     0x0400   文件存在且有O_CREAT,创建文件的操作会出错,打开文件也会出错。

#define  O_APPEND               0x0800   数据追加到文件末尾,而且文件指针移动无效,只能追加在末尾。

第三个mode参数(当flag中出现O_CREAT时,才可能要运用到的参数)

本身是有宏定义的(文件中是十六进制定义宏的,个人习惯用八进制)

     S_IRWXU:                   文件拥有者有读写执行权限                700
     S_IRUSR (S_IREAD):  文件拥有者仅有读权限                       400
     S_IWUSR (S_IWRITE):文件拥有者仅有写权限                       200
     S_IXUSR (S_IEXEC):  文件拥有者仅有执行权限                    100
     S_IRWXG:                   组用户有读写执行权限                        070
     S_IRGRP:                    组用户仅有读权限                              040
     S_IWGRP:                   组用户仅有写权限                              020
     S_IXGRP:                    组用户仅有执行权限                           010
     S_IRWXO:                   其他用户有读写执行权限                     007
     S_IROTH:                    其他用户仅有读权限                            004
     S_IWOTH:                   其他用户仅有写权限                             002
     S_IXOTH:                    其他用户仅有执行权限                          001

虽然是权限写上了,可是linux为了安全还有一个umask函数,实际权限是mode&~umask,我的机子的umask默认值是002,就是默认其他用户无写的权利,但如果你想要改成有所有权限的话,可以用在创建文件之前调用umask(0),这样umask的值就变成0了,然后计算的时候由于”~“变777,这样就可以得到所有权限。

而终端下创建文件默认文本文件为666,就是所有人都没有执行权限,虽然我也不知道文本有什么执行权限可言。。。。。。。

但其实创建出来是664,因为002的运算,其他用户的不可写性。


create函数


#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

int creat (const char *pathname, mode_t mode);

其实create就是这个open(const char *pathname,(O_CREAT|O_WRONLY|O_TRUNC));


close函数:


#include<unistd.h>

int close (int fd)

用于关闭打开的文件,虽然进程结束回把文件自动关闭,但是显示的调用close函数好习惯。


read函数

#include<unistd.h>

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

把fd指向的文件中的count字节读出读到buf指向的缓存中。返回值是读到的字节数。


write函数


#include<unistd.h>

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

把buf指向的空间中的count字节数据写入fd指向的文件中。返回值是读到的字节数。


lseek函数


#include<sys/types.h>

#include<unistd.h>

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

lseek返回的值是距离文件开始的字节数 ,可以利用这个用int  count = lseek(fd,0,SEEK_END)来获取文件字节数。

lseek(fd,offset, whence)可以用来移动文件指针,其移动的方式是对fd指向的文件从标志为whence,移动offset个字节。


最后说说dup2这个神奇的函数


#include<unistd.h>

int dup2 (int oldfd , int newfd)

文件描述符0代表标准输入文件,1代表标准输出文件,2代表错误输出。

然后dup2可以用newfd指定新文件描述符的值,即oldfd和newfd同时指向该文件,如果將newfd设为1,就可以把屏幕上显示的东西写入文件中,却不在屏幕上显示。

例如 : dup2(oldfd,1);






0 0