关于unix系统接口 普通文件io的小结

  首先是常用的几个函数  open , read,write,lseek, close

  open函数  函数原型  int open(char *  path,int  oflag,...)           返回值是一个文件描述符   path顾名思义就是文件名  oflage文件是打开方式   第三个形参应用于创建文件时使用  /*创建文件其实还有一个create函数使用  以及openat由于还未使用过这个函数和open的差异 所以不在此处累赘*/          open函数  使用if  判断的时候 注意小细节

  read函数   函数原型   ssize_t   read(int fd  ,   void* buf , size_t nbytes)    返回值是文件读取字节数  在好几种情况下会出现返回值不等于文件读取字节数 也就是第三个参数nbytes的情况  第二个形参buf读取到buf的内存  文件偏移量(current  file offset)受改变

  write函数   函数原型  ssize_t  write(int fd , const  void* buf, size_t nbytes)   返回值是文件写入字节数    fd是文件描述符  将buf内容写入nbytes个字节到文件  但这里需要注意默认情况是需要在系统队列中等待写入(打开方式不同也会不同)    //以上三个出错都返回-1

  lseek函数off_t lseek(int fd, off_t offset , int whence)   返回值成功函数返回新的文件偏移量  失败-1   fd文件描述符   off_t是有符号的整数  whence其实是和off_t配套使用的  SEEK_SET文件开始处   SEEK_CUR当前值的相对位置  SEEK_END文件长度+-

  close函数原型  int close(int fd)    返回值 成功返回0  失败—1    关闭文件描述符

  下面就有俩个重要的概念 一个是内核用三种数据结构来表示打开文件  另一个也和它有原因就是文件io的原子性

  由于在linux环境下没有画图的软件  就加以简单描述三种文件状态数据结构  第一个是文件描述符fd的描述(我懒没查 我更喜欢知道原理 用的时候再查细节  = =!!)第二个是文件表项  第三个是v节点  第一个第二个是呈链表状

然后文件表项指向v节点   不同的fd文件描述符访问同一文件就是访问不同的fd指向同一个v节点

 1 struct Fd{
 2      int fd;            //文件描述符
 3      void*  filePtr;     //文件指针指向文件表
 4 };
 5
 6
 7 struct FileTable{
 8      int fileMark;    // 文件状态标志
 9      off_t offset;      //文件偏移量
10      void* vNode;
11 }
12  //其实还有第三个的 我没学到所以也就不害人了  

  看完上面这个很破很破的代码(命名没有大写)的时候你应该发现一个问题了如果两个线程访问同一文件 会产生一个操作异常其实就是各自的的文件表项的数据异步造成的 可能会造成覆盖另一条进程的数据  这里就体现了原子操作的必要性了 它的意思就是所有操作会一次性完成操作系统不会只执行一半就去执行另一条进程了

  fcntl函数   int fcntl(int fd , int cmd,...)     这个函数可以改变已经打开文件的属性  但是要注意必须先获得目前的标志值  然后再设置 上code   应用于一个以创建文件以只读打开  使用fcntl修改打开状态写入文本

  1 #include<apue.h>  2 #include<fcntl.h>  3 void set_fl(int fd, int flags)        // flags are file status to ture on   4 {  5         int val ;  6         if((val  =  fcntl(fd,F_GETFL, 0)) <  0){  7                 printf("err -1!");  8                 err_sys("fcntl get  error!");  9         } 10         val |= flags; 11         if( fcntl(  fd , F_SETFL , val) <  0){ 12                 printf("error  0!"); 13                 err_sys("fcontl set error!"); 14         } 15  16 } 17  18 int main(void) 19 { 20         int fd  = 0; 21         char buf[] = "xiaochen"; 22  23         if((fd  = open("aa.txt" , O_WRONLY )) < 0){ 24                 printf("err 1!"); 25                 err_sys("open error!"); 26         } 27         set_fl(fd,O_WRONLY); 28         if(write(fd , buf , 8) != 8 ){ 29                 printf(" err 2!"); 30                 err_sys("write error"); 31         } 32  33         close(fd); 34         return  0; 35  36 }~                                                                                                                                                                                                                                            ~                                 

  由于只是总结不做太多细节描述

完。。。。          //书读少了好多都只知道概念 上面函数都有简单的小demo 我比较懒破代码就不show了  学完一章做个小总结还是很有用的 如果您有一天看见这篇破文章有学习上的问题或者发现博文里我的错误 请联系我很会非常感谢您  qq:1639153000

时间: 2024-11-05 22:23:37

关于unix系统接口 普通文件io的小结的相关文章

《C程序设计语言》笔记 (八) UNIX系统接口

8.1 文件描述符 UNIX操作系统通过一系列的系统调用提供服务,这些系统调用实际上就是操作系统内的函数 ANSI C标准函数库是以UNIX系统为基础建立起来的 在UNIX系统中所有的外围设备都被看作是文件系统中的文件,因此,所有的输入输出都要通过文件读写完成 也就是说,通过一个单一的接口就可以处理外围设备和程序之间的所有通信 在读写文件之前,必须先将这个意图通知系统,该过程称为打开文件 如果是写写一个文件,则可能需要先创建该文件 操作系统想程序返回一个小的非负整数,该整数称为文件描述符. 任何

UNIX,基础知识,文件IO,文件和目录

2015.1.27星期二,早晨阴天,中午下雪了今天上午老师不上课,程序语句,记一下:main(void){ int c; while((c = getc(stdin)) != EOF) if(putc(c,stdout) == EOF) 将字符写到标准输出 err_sys("output error"); if(ferror(stdin)) err_sys("input error"); exit(0);} 从标准输入读命令并执行:int main(){ char

Linux系统开发 2 文件IO open() close() read() write() perror() lseek() fcntl() ioctl()

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 大纲 Linux系统开发 man 文档的使用 文件IO open() 创建文件,指定权限位 open() 接收参数 创建文件 open() 传两个参数 第三个参数从内存取垃圾值 write()函数 向文件写数据 write()函数的覆盖操作 open()函数文件的追加 open() 创建文件,如果文件已经存在,就报错 测试一个程序最多能创建1021个文件,3个STDIN STDOUT STDERR已经存在了

linux系统编程之文件IO

1.打开文件的函数open,第一个参数表示文件路径名,第二个为打开标记,第三个为文件权限 代码: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<stdio.h> int main() { int fd; fd = open("testopen1",O_CREAT,0777); printf("fd = %d\n",fd)

Unix高级编程之文件IO

文件io---低级io 特点: 不带缓存io优点: 实时性高 1.io基本操作 文件描述符:文件io打开文件的标识 非负整型数,是内核为打开文件维护结构的数组下标 默认最多能打开1024文件 stdin-----0 stdout-----1 stderr-----2 函数: open(2); read(2); write(2); lseek(2); <1>允许偏移的字节个数大于文件本身 <2>lseek()本身不进行读写操作 空洞文件 空洞文件本身不占用磁盘空间 close(2);

【Linux系统编程】文件IO操作

文件描述符在 Linux 的世界里,一切设备皆文件.我们可以系统调用中 I/O 的函数(I:input,输入:O:output,输出),对文件进行相应的操作(?open().close().write() .read() 等). 打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,文件描述符用来指定已打开的文件.这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个描述符所指定的文件. 程序运行起来后(每个进程)都有一张文件描述符的

Unix系统数据文件

UNIX系统的正常运行需要使用大量与系统有关的数据文件,例如口令文件/etc/passwd.组文件/etc/group.网路服务/etc/services.协议信息/etc/protocols.网络信息/etc/networks.主机数据/etc/hosts等.下面主要说明一下口令文件. 口令文件-- UNIX系统的口令文件在Linux上可能有下面一行: root:x:0:0:root:/root:/bin/bash 上面各字段以冒号分割,与"pwd.h"中定义的passwd结构对应:

linux/unix系统间文备份脚本

这是我之前写的一个shell脚本,用于linux/unix系统间的文件自动备份. 脚本的主要功能有: 用于不同服务器间当天的文件的同步或拷贝:需要expect命令支持,RHEL和AIX测试正常,需要expect命令支持(unix系统需要修改脚本第一行的#!/bin/bash为系统SHELL): 使用要求: 系统expect命令可用:目标(远程)设备文件夹存在且可有相应权限.适用情况(以下场景测试正常):        一台设备同一文件夹向一台或多台远程设备相同或不同文件夹拷贝文件        

TLPI(liunx/unix系统编程手册)笔记(三) 文件IO:通用的IO模型

读下来总的就是介绍了四个IO的API--open,read,write,close. 大家都是知道的,everything is file,在linux系统里面一切都是看作文件来操作的,学习linux就得先学好文件IO,也可以看见TLPI这本书的介绍完一些概念之后就开始介绍文件IO了. IO,大概的分为磁盘文件IO,buffering(缓冲)IO.貌似缓冲的水很深,之后会写博客. ------------------------------------ (1)文件描述符. 在进行IO操作之前,总