linux系统编程-文件IO操作

时间:2022-10-31 14:46:14

四个主要的系统调用函数解释

  1. 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
  1. 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
  1. write() 将数据写入到一个打开的文件中
#include <unistd.h>
ssize_t write(int fd, void *buffer, size_t count);
return number of bytes written, or -1 on error
  1. close 关闭一个打开的文件描述符,并释放回调用进程,供该进程继续使用,当已近称终止的时候,将自动关闭其打开的所有文件描述符

显示关闭不再需要的文件描述符是良好编程习惯的体现,文件符是有限资源,文件符关闭失败可能导致一个进程讲文件描述符资源消耗殆尽,在编写长期处理大量文件的程序的时候,需要加以关注

#include <unistd.h>
int close(ind fd);
return -1 on error

open() 函数中的参数

  1. 文件打开模式

    访问模式 描述
    O_RDONLY 以只读模式打开文件
    O_WRONLY 以只写模式打开文件
    O_RDWR 以读写模式打开文件
    O_CREAT 如文件不存在则创建之
    O_DIRECTORY 如pathname不是目录,失败
    O_TRUNC 截断已有文件,使其长度为0
  2. 文件新建文件时的访问权限

    权限 描述
    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系统编程手册》