看了几天的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);