文件描述符

定义:对内核而言,文件描述符相当于一个文件的标识,它是一个非负整数,当打开(open)一个现有文件或者创建(creat)一个新文件时,内核会向进程返回一个文件描述符 
在unix中(文件描述符 0–标准输入 1–标准输出 2–标准错误)

open

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname, int flag, mode_t  mode)

参数1:打开或者创建文件的名字 
参数2:选项参数,可选择多个参数用 | 构成 
其中: O_RDONLY 只读打开 O_WRONLY只写打开 O_RDWR读写打开只能选择一个 
下面是可选择的 
O_APPEND 每次都追加在文件的尾端 
O_CREAT 若文件不存在,则创建它,使用此项,需要指定第三个参数mode,用于设定新文件的权限 
O_EXCL 若指定了O_CREAT,而文件存在则会报错,用于测试一个文件是否存在,不存在则创建 
O_TRUNC 如果此文件存在,而且为只写或读写成功打开,则将其长度截为0 
参数3:…表示余下参数的数量和类型根据具体调用会有所不同,通常创建新文件时才使用表示权限

read

#include <unistd.h>
size_t read(int fd,void *buf,size_t nbytes)

描述:从文件描述符相关联的文件里读入nbytes个字节的数据,把它们放到数据区buf中,并返回读入的字节数 
参数1:文件描述符 
参数2:存放从文件中读取的数据的存储区 
参数3:读出的字节数 
返回值 
0 未读入任何数据,已达文件尾 
-1 表示出错 
其它 读出的字节数

write

#include <unistd.h>
size_t write(int fd,const void *buf,size_t nbytes)

描述:把缓冲区buf前nbytes个字节写入文件描述符fd相关联的文件中,返回实际写入的字节数 
参数1:文件描述符 
参数2:写入文件的缓冲区指针 
参数3:读出的字节数 
返回值 
0 未写入任何数据 
-1 表示出错 
其它 写入的字节数

lseek

#include <unistd.h>
off_t lseek(int fd,off_t offset,int whnece)

描述:移动文件指针到指定位置 
参数1:文件描述符 
参数2:偏移量,具体与第三个参数有关 
参数3:SEEK_SET 文件头 SEEK_CUR 当前位置 SEEK_END 文件尾

close

#include <unistd.h>
int close(int fd)

描述:关闭一个打开的文件 
参数1:文件描述符 
返回值 
小于0 关闭失败 
其它 关闭成功

下面根据上述写一个综合案例

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    int fd,size;
    char* buf = "hello,I'm wxp,this is my job!";
    char buf_r[20];
    int len = strlen(buf);//数组长度

    printf("len = %d\n",len);

    /*调用open创建wxp.c*/
    if((fd = open("./wxp.c",O_CREAT|O_TRUNC|O_RDWR,0666)) < 0)
    {
        printf("open fail\n");
        exit(1);
    }
    else
    {
        printf("open file: wxp.c fd = %d\n",fd);
    }

    /*write写入*/
    if((size = write(fd,buf,len)) < 0)
    {
        printf("write fail\n");
        exit(1);
    }
    else
    {
        printf("write: %s\n",buf);
        printf("write size = %d\n",size);
    }

    /*lseek函数移动文件指针位置到文件开头*/
    lseek(fd,0,SEEK_SET);
    if((size = read(fd,buf_r,15)) < 0)
    {
        printf("read fail\n");
        exit(1);
    }
    else
    {
        buf_r[15] = '\0';
        printf("read from wxp.c the content is %s\n",buf_r);
        printf("read size = %d\n",size);
    }

    if(close(fd) < 0)
    {
        printf("close fail\n");
        exit(1);
    }
    else
    {
        printf("close wxp.c\n");
    }
    return 0;

}

Linux系统编程---文件I/O(open、read、write、lseek、close)的更多相关文章

  1. Linux系统编程--文件IO操作

    Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...

  2. Linux系统编程@文件操作(一)

    只总结了部分常用的内容,详细内容参考<UNIX环境高级编程>及相关书籍. Linux中文件编程可以使用两种方法 Linux系统调用(依赖于系统) C语言库函数(不依赖于系统) Linux系 ...

  3. linux系统编程--文件IO

    系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...

  4. Linux系统编程--文件描述符的复制dup()和dup2()【转】

    本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...

  5. Linux C 程序 文件操作(Linux系统编程)(14)

    文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...

  6. linux系统编程之文件与io(一)

    经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自 ...

  7. linux系统编程之文件与io(五)

    上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...

  8. Linux系统编程温故知新系列 --- 01

    1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...

  9. linux系统编程之错误处理

    在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...

随机推荐

  1. linux ftp服务器搭建

    作为服务器的机器IP:192.168.124.129  主机名:Centos 操作系统:CentOS 5.5 需求:匿名用户可以下载公共目录里边内容,本地用户登录有rwx权限 软件安装 1.  准备测 ...

  2. Python基础之 一

    语言分类:编译型(运行前先编译)和解释型(直接运行),静态语言(需要声明变量类型)和动态语言(不需要声明),强类型定义语言(定义好类型不做强制转换就不可修改类型)和弱类型定义语言(数据类型可以被忽略) ...

  3. Codeforces Round #489 (Div. 2) B、C

    B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...

  4. 选择器的使用(first-child和last-child选择器)

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  5. 深度学习——练习

    对于深度学习的基础,线性回归以及逻辑回归,下面针对这两个方面做一个练习. 例子主要参考http://openclassroom.stanford.edu/MainFolder/CoursePage.p ...

  6. 【CV知识学习】early stop、regularation、fine-tuning and some other trick to be known

    深度学习有不少的trick,而且这些trick有时还挺管用的,所以,了解一些trick还是必要的.上篇说的normalization.initialization就是trick的一种,下面再总结一下自 ...

  7. Windows 7 SID 修改

    在安裝Windows系統時會產生一個獨一無二的SID (Security ID),它用來識別每一部主機,若在同一個區域網路內有兩部相同SID的主機,會出現警告訊息.一般而言,每次安裝時的SID不可能會 ...

  8. AE After Effect 如何分段渲染

    如果只要第一段的话,你把要输出的那段首尾处分别按下B键和N键,这样输出时就会只输出这一段了(拖动首尾的栏目修改起始和终止的时间):如果是批量渲染的话你只要在这些不同的合成层里,每个按下ctrl+M键, ...

  9. HDU 4968(杭电多校#9 1009题)Improving the GPA (瞎搞)

    题目地址:HDU 4968 这题的做法是全部学科的学分情况枚举,然后推断在这样的情况下是否会符合平均分. 直接暴力枚举就可以. 代码例如以下: #include <cstring> #in ...

  10. CSS Modules 解决 react 项目 css 样式互相影响的问题

    1. CSS Modules引入目的 写过CSS的人,应该都对一大长串选择器选中一个元素不陌生吧,这种方式,其实定义的就是全局样式,我们时常会因为选择器权重问题,没有把我们想要的样式加上去. 另外,每 ...