文件系统调用示例

本程序可通过以下命令行方式运行
假设aaa,bbb是两个文本文件

copyfile.exe  aaa  bbb

把文件aaa内容复制到bbb,如果bbb已经存在,aaa就会覆盖它,否则,就创建它,程序调用必须提供两个参数:第一个是输入文件,第二个是输出文件.

具体代码如下:

#include 
#include 
#include 
#include  //fcntl.h是unix标准中通用的头文件,其中包含的相关函数有open,fcntl,shutdown,unlink,fclose等
#include  //是C和C++程序设计语言中提供对POSIX操作系统API的访问功能的头文件的名称

#define BUF_SIZE 4096
#define OUTPUT_MODE 0700
int main(int argc,char *argv[])
{
    int in_fd,out_fd,rd_count,wt_count;
    char buffer[BUF_SIZE];
    if(argc!=3)
        exit(1);
    in_fd = open(argv[1],O_RDONLY);//O_RDONLY 以只读方式打开文件
    if(in_fd<0)
        exit(2);
    out_fd = creat(argv[2],OUTPUT_MODE);
    if(out_fd<0)
        exit(3);

    while(1)
    {
        rd_count = read(in_fd,buffer,BUF_SIZE);
        if(rd_count<=0)
            break;
        wt_count = write(out_fd,buffer,rd_count);
        if(wt_count <= 0)
            exit(4);
    }
    close(in_fd);
    close(out_fd);
    if(rd_count == 0)
        exit(0);
    else
        exit(5);
    return 0;
}

//D:\Ccode\OS-读写文件\bin\Debug\OS-读写文件.exe D:\aaa.txt D:\bbb.txt

int main(int argc,char *argv[])
main有两个参数,第一个表示调用该程序时命令行中包含多少个字符串,包括该程序名argv[]应该包含指向下列值的指针:

argv[0] = "copyfile.exe"
argv[1] = "aaa"
argv[2] = "bbb"

在Codeblocks中调试时我们先选择Project,然后选择Project-Set Program’s Arguments,再按照下图设置
文件系统调用示例_第1张图片
在此之前我们可以现在D盘下创建aaa,bbb两个文件
aaa中输入hello,bbb文件为空,运行程序后,会发现bbb文件内容与aaa内容相同.

我们来看一下具体程序

首先声明了五个变量,(1)in_fd和out_fd用来保存文件描述符,即打开一个文件时返回的一个小整数,(2)rd_count和wt_count分别是由read和write系统调用所返回的字节数,(3)最后一个buffer是用来保存读出的数据以及提供写入数据的缓冲区.

  • 接着我们试图打开源文件并创建目标文件。如果源文件成功打开,系统会给in_fd赋予一个小的整数,用以标识源文件。后续的调用必须引用这个整数,使系统知道需要的是哪一个文件。类似地,如果目标文件也成功地创建了,out_fd会被赋予一个标识用的值。creat的第二个变量是设置保护模式。如果打开或创建文件失败,对应的文件描述符被设为-1,程序带着错误码退出。
  • 接下来是用来复制文件的循环。 一 开始试图读出4KB数据到buffer中。它通过调用库过程read来完成这项工作,该过程实际激活了read系统调用。第一个参数标识文件,第二个参数指定缓冲区,第三个参数指定读出多少字节。赋予rd_count的字节数是实际所读出的字节数。通常这个数是4096,除非剩余字节数比这个数少。当到达文件尾部时,该参数的值是0。如果rd_count是零或负数,复制工作就不能再进行下去,所以执行break语句,用以中断循环(否则就无法结束了)。
  • 调用write把缓冲区的内容输出到目标文件中去。同read类似,第一个参数标识文件,第二个参数指定缓冲区,.第三个参数指定写入多少字节。注意字节计数是实际读出的字节数,不是buf_ size。这一点是很重要的,因为最后一个缓冲区中的数据大小一般不会是4096,除非文件长度碰巧是4KB的倍数。
  • 当整个文件处理完时,超出文件尾部的首次调用会把0值返回给rd_count,这样,程序会退出循环。
  • 此时,关闭两个文件,程序退出并附有正常完成的状态码。



Linux-文件操作

本文介绍文件的通用操作方法.先介绍如何建立文件,打开文件,读取和写入数据.
文件描述符
Linux下用文件描述符来表示设备文件和普通文件.文件描述符是一种整型的数据,所有对文件的操作东通过文件描述符实现.
文件描述符是连接用户空间和内核空间的枢纽.当打开一个或者创建一个文件时,内核空间创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程.进程用这个文件 描述符来对文件进行操作.用户空间的操作,例如读写一个文件时,将文件描述符作为参数传送给read或write.读写函数的系统调用到达内核时,内核解析文件描述符的整型变量,找出对应的设备文件相应的函数,并返回用户空间的结果.
文件描述符的范围是0-OPEN_MAX,因此是一个有限的资源,在使用完毕后用要及时释放,通常是调用close()函数关闭.文件描述符的值仅在同一个进程中有效.
在Linux系统中有3个已经分配的文件描述符,即标准输入,标准输出和标准错误,它们文件描述符的值分别为0,1,2.

打开创建文件open() create()函数
函数原型如下

int open(const char *pathname, int flags);
int open(const char *pathname,int flags,mode_t mode);

关闭文件close()函数

你可能感兴趣的:(Linux)