四个主要的系统调用函数解释
-
open()
函数可以打开一个已经存在的文件,也能创建并打开一个文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flag, .../*modr_t mode*/)
return file descriptor on success, or -1 on error
-
read()
从文件描述符fd
所指代的打开文件中读取数据
#include<unistd.h>
ssize_t read(int fd, void *bufer, size_t count);
return number of byte, 0 or EOF, or -1 on error
-
write()
将数据写入到一个打开的文件中
#include <unistd.h>
ssize_t write(int fd, void *buffer, size_t count);
return number of bytes written, or -1 on error
-
close
关闭一个打开的文件描述符,并释放回调用进程,供该进程继续使用,当已近称终止的时候,将自动关闭其打开的所有文件描述符
显示关闭不再需要的文件描述符是良好编程习惯的体现,文件符是有限资源,文件符关闭失败可能导致一个进程讲文件描述符资源消耗殆尽,在编写长期处理大量文件的程序的时候,需要加以关注
#include <unistd.h>
int close(ind fd);
return -1 on error
open()
函数中的参数
-
文件打开模式
访问模式 描述 O_RDONLY 以只读模式打开文件 O_WRONLY 以只写模式打开文件 O_RDWR 以读写模式打开文件 O_CREAT 如文件不存在则创建之 O_DIRECTORY 如pathname不是目录,失败 O_TRUNC 截断已有文件,使其长度为0 -
文件新建文件时的访问权限
权限 描述 S_IRUSR 文件所有者可写 S_IWUSR 文件所有者可读 S_IRGBP 组用户可写 S_IWGBP 组用户可读 S_IROTH 其他用户可读 S_IWOTH 其他用户可写
使用系统调用实现文件的拷贝功能例子
使用了QT图形库,这里的文件拷贝实现的函数是QT应用中的一个槽函数,用于对拷贝的响应
/*拷贝到对应的路径下*/
void MainWindow::copySlot(){
//打开或者创建目的文件
QString desFile = ui->copyFilePath->text();
if(desFile.isEmpty()){
QMessageBox::information(this, tr("错误提示"), tr("输入路径名为空"));
return;
}
this->desFileName = desFile.toStdString();
int mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH | S_IROTH;
int outputFd = ::open(desFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC, mode); //open desFile
if(outputFd == -1) {
qDebug() << tr("创建文件失败");
exit(EXIT_FAILURE);
}
//打开源文件
int inputFd = open(this->srcFileName.c_str(), O_RDONLY); //open SrcFile
if(inputFd == -1){
qDebug() << tr("打开文件失败");
exit(EXIT_FAILURE);
}
//从源文件中读取数据拷贝到目的文件中
char buffer[BUF_SIZE];//设置缓冲区
size_t numRead;
while((numRead = ::read(inputFd, buffer, BUF_SIZE)) > 0){ //copy
::write(outputFd, buffer, numRead);
qDebug() << buffer;
}
::close(inputFd);
::close(outputFd);
}
本文参考:
《Linux_unix系统编程手册》