Linux底层文件访问主要包括以下几个方面的系统调用:
1、write系统调用
#include <unistd.h> size_t write(int fildes, const void *buf, size_t nbytes);
功能:把缓冲区buf的前nbytes个字节写入与文件描述符fildes关联的文件中。
返回值:实际写入的字节数。
#include <unistd.h> #include <stdlib.h> int main() { if((write(1, "Here is some datan", 18)) != 18) { write(2, "A write error has occurred on file descriptor 1n", 46); } return 1; }
#include <unistd.h> size_t read(int fildes, void *buf, size_t nbytes)
功能:从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并将它们放到数据区buf中。
返回值:实际读入的字节数。
#include <unistd.h> #include <stdlib.h> int main() { char buffer[128]; int nread; nread = read(1, buffer, 128); if(nread == -1) write(2, "A read error has occurredn", 26); if((write(1, buffer, nread)) != nread) write(2, "A write error has occurredn", 27); return 0; }
#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int open(const char *path, int oflags); int open(const char *path, int oflags, mode_t mode);
功能:创建一个新的文件描述符。
返回值:返回文件描述符。失败返回-1.
#include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> int main() { int fildes; int nread; char buf[500]; fildes = open("/home/furney/Desktop/simple_write.c", O_RDONLY); if(fildes != -1) { nread = read(fildes, buf, 500); if(nread == -1) write(2, "A read error has occurredn", 26); if((write(1, buf, nread)) != nread) write(2, "A write error has occurredn", 27); } return 0; }
4、umask系统调用
umask是一个系统变量。当文件被创建时,为文件的访问权限设定一个掩码。由三个八进制数字组成,每个数字都是八进制值1、2、4的OR操作结果。
5、close系统调用
#include <unistd.h> int close(int fildes);功能:终止文件描述符fildes与其对应文件之间的关联。
返回值:成功是返回0,失败时返回-1。
6、ioctl系统调用
#include <unistd.h> int ioctl(int fildes, int cmd, ...);功能:对描述符fildes引用的对象执行cmd参数中给出的操作。
7、lseek系统调用
#include <unistd.h> #include <sys/types.h> off_t lseek(int fildes, off_t offset, int whence);功能:对文件描述符fildes的读写指针进行设置。
返回值:返回从文件头到文件指针被设置处的字节偏移值,失败时返回-1。
8、fstat、stat、lstat系统调用
#include <unistd.h> #include <sys/stat.h> #include <sys/types.h> int fstat(int fildes, struct stat *buf); int stat(const char *path, struct stat *buf); int lstat(const char *path, struct stat *buf);功能:返回与打开的文件描述符相关的文件的状态信息。其中lstat返回的是符号链接本身的信息。
9、dup和dup2系统调用
#include <unistd.h> int dup(int fildes); int dup2(int fildes, int fildes2);功能:dup复制文件描述符。dup2通过明确指定目标描述把一个文件描述符复制为另一个。
下面的示例程序是利用以上系统调用实现文件复制,每次从源文件中读取数据块复制到目标文件。
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int main() { char block[1024]; int in, out; int nread; in = open("file.in", O_RDONLY); out = open("file.out", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if(in != -1 && out != -1) { while((nread = read(in, block, 1024)) > 0) write(out, block, nread); } return 0; }