第三章 文件操作(2)

来源:互联网 发布:广西广电网络微信缴费 编辑:程序博客网 时间:2024/04/29 20:18

1.chmod系统调用

功能:改变文件或者目录的访问权限。

#include

int chmod(const char *path, mode_t mode);

path参数指定需要被修改的文件,mode提供权限。mode的定义与open系统调用中的一样,也是对所要求的访问权限进行按位OR操作。

2.chown系统调用

功能:改变一个文件的属主

#include

#include

int chown(const char *path, uid_t owner, gid_t group);

这个调用使用的是用户ID和组ID的数字值(通过getuid和getgid调用获得)和一个用于限定谁可以修改文件属主的系统值。

3.unlink、link和symlink调用

unlink:删除一个文件。unlink系统调用删除一个文件的目录项并减少它的链接数。它在成功时返回0,失败时返回-1。

#include

int unlink(const char *path);

int link(const char *path1, const char *path2);

int syslink(const char *path1, const char *path2);

如果一个文件的链接数减少到零,并且没有进程打开它,这个文件就会被删除。rm使用的就是unlink调用。先用open创建一个文件,然后对其调用unlink是某些程序员用来创建临时文件的技巧。这些文件只有在被打开的时候才能被程序员使用,当程序退出并且文件关闭的时候文件就会被自动删除。

link系统调用将创建一个指向已有文件path1的新链接,新目录项path2给出。

symlink系统调用以类似的方法创建符号链接。

注意:一个文件的符号链接并不会增加该文件的链接数,所以它不会像普通(硬)链接那样防止文件被删除。

4.mkdir和rmdir系统调用

#include

#include

int mkdir(const char *path, mode_t mode);

mkdir用于创建目录,它相当于mkdir程序。mode参数按照open系统调用的O_CREAT选项中的有关定义设置(同时也会受到umask的影响)。

#include

int rmdir(const char *path);

rmdir用于删除目录,但只有在目录为空时才行。rmdir程序就是用这个系统调用来完成工作的。

5.chdir系统调用和getcwd函数

chdir可以用在程序里面实现切换目录。

#include

int chdir(const char *path);

程序可以通过getcwd函数来确定自己的当前工作目录。

#include

char *getcwd(char *buf, size_t size);

getcwd函数把当前目录的名字写到给定的缓冲区buf里面。如果目录名的长度超出了参数size给出的缓冲区长度,它就返回NULL;如果成功,它返回指针buf。

注意:如果在程序运行过程中,目录被删除(EINVAL错误)或者有关权限发生了变化(EACCESS错误),getcwd也可能会返回错误。

6.与目录操作有关的函数在dirent.h头文件中声明。它们使用一个名为DIR的结构作为目录操作的基础。被称为目录流的指向这个结构的指针(DIR*)被用来完成各种目录操作,其使用方法与用来操作普通文件的文件流(FILE*)非常相似。目录项数据本身则在dirent结构中返回,该结构也是在dirent.h中声明的,这是因为用户不应直接改动DIR结构中的数据字段。

7.opendir函数

opendir函数的作用是打开一个目录并建立一个目录流。如果成功,它将返回一个指向DIR结构的指针,该指针用于读取目录数据项。

#include

#include

DIR *opendir(const char *name);

opendir在失败时返回一个空指针。

注意:目录流使用一个底层文件描述符来访问目录本身,所以如果打开的文件过多,opendir可能会失败。

8.readdir函数

readdir函数返回一个指针,该指针指向的结构里面保存着目录流dirp中下一个目录项的有关资料。后续的readdir调用将返回后续的目录项。如果发生错误或者到达目录尾,readdir将返回NULL。POSIX兼容的系统在到达目录尾时将会范虎NULL,但并不改变errno的值。

#include

#include

struct dirent *readdir(DIR *dirp);

注意:如果在readdir函数扫描目录的同时还有其他进程在该目录里创建或者删除文件,readdir将不能保证能够列出该目录里面所有的文件。

dirent结构体中包含的目录项内容包含以下部分:

ino_t d_ino:文件的inode节点号。

char d_name[]:文件的名字。

9.telldir函数

telldir函数的返回值记录着一个目录流里的当前位置。可以在随后的seekdir调用中利用这个值来重置目录扫描到当前位置。

#include

#include

long int telldir(DIR *dirp);

10.seekdir函数

seekdir函数的作用是设置目录流dirp的目录项指针,loc的值用来设置指针位置,它应该通过前一个telldir来获得。

11.closedir函数

closedir函数关闭一个目录流并且释放与之关联的资源。成功返回0,失败返回-1。

#include

#include

int closedir(DIR *dirp);

12.错误处理

(1)strerror函数

strerror函数把错误代码映射为一个字符串,该字符串对发生的错误类型进行说明。

#include

char *strerror(int errnum);

(2)perror函数

perror函数也把errno变量中报告的当前错误映射到一个字符串,并把它输出到标准错误输出流。该函数会在该字符串的前面加上字符串s(如果不为空)中给出的信息,再加上一个冒号和一个空格。

#include

void peeror(const char *s);

13.用于与设备驱动程序进行通信的工具已经比较常见,hdparm可以用来配置一些磁盘参数,ifconfig可以报告网络统计信息。Linux提供了一个特殊的文件系统procfs,它通常以/proc目录的形式呈现。该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问。

在/proc目录中会包含很多常用的文件,一般只需读取这些文件就可以获得状态信息。例如:

# cat /proc/cpuinfo

补充:/proc目录中的有些条目不仅可以被读取,而且可以被修改。例如,系统中所有运行的程序同时能够打开的文件总数是Linux内核的一个参数。它的值可以通过读取/proc/sys/fs/file-max文件得到:

# cat /proc/sys/fs/file-max

将系统范围的文件句柄限制增加为80000

# echo 80000 >/proc/sys/fs/file-max

注意:/proc目录中以数字命名的子目录用于提供正在运行的程序的信息。每个进程都有一个唯一的标识符:一个在1~32000的数字。

14.fcntl调用

#include

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

实例:

fcntl(fd, F_DUPFD,newfd):这个调用返回一个新的文件描述符,其数值等于或者大于整数newfd。新文件描述符是描述符fd的一个副本。

fcntl(fd,F_GETFD):这个调用返回在fcntl.h头文件里面定义的文件描述符标志,其中包括FD_CLOEXEC,它的作用是决定是否在成功调用了某个exec系列的系统调用之后关闭该文件描述符。

fcntl(fd, F_SETFD, flags):这个调用用于设置文件描述符标志,通常仅用来设置FD_CLOEXEC。

fcntl(fd, F_GETFL)和fcntl(fd, F_SETFL,flags):这两个调用分别来获取和设置文件状态标志和访问模式。

15.mma系列函数

(1)mmap函数的功能是建立一段可以被两个或者更多个程序读写的内存。

mmap函数创建一个指向一段内存区域的指针,该内存区域可以通过一个打开的文件描述符访问的文件的内容相关联。

#include

void *mmap(void *addr, size_t len, int prot, int flags, int fd,off_t off);

如果addr的值取0,结果指针就将自动分配,这是推荐的做法,否则会降低程序的可移植性,因为不同系统上的可用地址范围是不一样的。

(2)msync函数的作用是:把在该内存段的某个部分或者整段中的修改写回到被映射的文件中(或者从被映射文件中读出)。

#include

int msync(void *addr, size_t len, int flags);

(3)munmap函数的作用是释放内存段

#include

int munmap(void *addr, size_t len);

0 0