Linux系统编程——IO编程

1.Linux文件操作
  “一切皆文件”是Linux系统的基本思想。Linux 提供的虚拟文件系统为多种文件系统和外设驱动提供了统一的接口,基于此类接口,可以实现文件的新建、打开(open)、读(read)、写(write)、关闭(close),及对随机文件的定位(lseek)。
  通常,一个进程打开现有文件或新建文件时,系统会返回一个文件描述符fd(file descriptor),指示特定的文件,后面的读写、关闭文件都通过此文件描述符进行操作。无错误状态下的文件描述符是非负数,打开文件前应检查该标识是否为非负数。
  一个进程运行时,都有一张自身的文件描述符,即是打开三个文件:标准输入、标准输出和标准出错处理。程序运行起来后,这三个文件是默认打开的。对应的宏描述为如下。
  #define STDIN_FILENO   0 //标准输入的文件描述符
  #define STDOUT_FILENO  1 //标准输出的文件描述符
  #define STDERR_FILENO   2 //标准错误的文件描述符

2.常用IO函数

2.1 open函数
函数原型:
  int open(const char *pathname, int flags, mode_t mode);
所需头文件:

#include 
#include 
#include 

函数功能:
  打开文件,文件不存在时则创建一个文件。
函数参数:
  pathname:被打开文件名,包括文件路径;
  flags:打开文件的行为标识,如只读、只写、读写等;具体参数选择标识及含义如下。

  注意:
    1)前三个取值参数不可使用“|”,但可以与后面几个取值参数进行“|”操作,进行选择相应功能;
    2)以读写方式打开只能用“O_RDWR”,不能用“O_REONLY|O_WRONLY”。
  mode:此参数只有在打开的文件不存时才有效,即是指定创建文件时的用户权限。
Linux系统编程——IO编程_第1张图片
函数返回值:
  成功:打开文件描述符。
  失败:-1。

2.2close函数
函数原型:
  int close(int fd);
所需头文件:

#include

函数功能:
  关闭已打开的文件。
函数参数:
  fd:文件描述符,open函数的返回值。
函数返回值:
  成功:0。
  失败:-1。

2.3read函数
函数原型:
  ssize_t read(int fd, void *addr, size_t count);
所需头文件:

#include

函数功能:
  读取指定的数据到内存。
函数参数:
  fd:文件描述符。
  addr:内存首地址,存放读取返回数据。
  count:读取的字节数。
函数返回值:
  成功:实际读取字节数。
  失败:-1。

2.4write函数
函数原型:
  ssize_t write(int fd, const void *addr, size_t count);
所需头文件:

#include

函数功能:
  向文件写入指定的数据。
函数参数:
  fd:文件描述符。
  addr:数据缓冲区首地址。
  count:待写数据字节数。
函数返回值:
  成功:实际写入的字节数。
  失败:-1。

2.5lseek函数
函数原型:
  off_t lseek(int fd,off_t offset,int whence)
所需头文件:

#include
#include

函数功能:
  指定文件操作地址偏移量。
函数参数:
  fd:文件描述符。
  offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。
  whence:当前位置基点,取值及含义如下。
这里写图片描述
函数返回值:
  成功:当前文件位置。
  失败:-1。

3.编程实例

3.1实例1
  利用IO函数读写文件。

#include 
#include 
#include 
#include 

int main(void)
{
    char *buf="Read and write test!";
    char buf_r[strlen(buf)+1];
    int fd,size,len;
    len = strlen(buf);
    buf_r[len] = '/0';
    //首先调用open 函数,并指定相应的权限
    if ((fd = open("io_test0.txt", O_CREAT | O_TRUNC | O_RDWR,0666 ))<0)
    {
        perror("open:");
        exit(1);
    }
    else
        printf("open and create file:io_test0.txt %d  OK\n",fd);
    //调用write 函数,将buf 中的内容写入到打开的文件中
    if ((size = write( fd, buf, len)) < 0)
    {
        perror("write:");
        exit(1);
    }
    else
        printf("write:%s OK\n",buf);
    // 调用lseek 函数将文件指针移动到文件开始8个字节,并读出余下内容 
    lseek(fd, 8, SEEK_SET );
    if ((size = read( fd, buf_r, len-8))<0)
    {
        perror("read:");
        exit(1);
    }
    else
        printf("read form file:%s OK\n",buf_r);
    if ( close(fd) < 0 )
    {
        perror("close:");
        exit(1);
    }
    else
        printf("close io_test0.txt OK\n");
    return 0;
}

Linux下运行结果:
Linux系统编程——IO编程_第2张图片

3.2实例2
  利用IO函数实现Linux命令终端的复制(cp)命令。使用 open() 打开源文件,使用 read() 从文件读数据,使用 write() 向目标文件写数据。

#include   
#include   
#include   
#include   

int main(int argc, char *argv[])  
{  
    if((argc == 3) && (strcmp(argv[1], argv[2]) != 0))  
    {// 保证有 3 个参数,而且源文件和目的文件名字不能一样  

        int fd_src, fd_dest, ret;  

        //只读方式打开源文件  
        fd_src = open(argv[1], O_RDONLY);   
        if(fd_src < 0)  
        {  
            perror("open argv[1]");  
            return -1;  
        }  

        // 新建目的文件  
        fd_dest = open(argv[2], O_WRONLY|O_CREAT, 0755);  
        if(fd_dest < 0)  
        {  
            close(fd_src);  
            perror("open argv[2]");  
            return -1;  
        }     
        do  
        {  
            char buf[1024] = {0};  
            // 从源文件读取数据  
            ret = read(fd_src, buf, sizeof(buf));  

            // 把数据写到目的文件,注意最后一个参数,有多少写多少  
            write(fd_dest, buf, ret);  
        }while(ret > 0);  

        // 关闭已打开的文件  
        close(fd_src);  
        close(fd_dest);  
    }     
    return 0;  
}  

Linux下运行结果:
Linux系统编程——IO编程_第3张图片

4.参考

[1] http://blog.csdn.net/tennysonsky/article/details/45868273
[2] http://blog.csdn.net/itcastcpp/article/details/38082035

你可能感兴趣的:(C,Linux应用编程)