一、lseek()重新定位文件的读写位置。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
功能:重新定位文件读写位置距离文件起始的偏移
参数:
fd:指定了具体的文件
offset:偏移
whence:
SEEK_SET:offset就是文件的偏移位置 指向文件的头部
SEEK_CUR:代表当前位置 当前位置+offset
SEEK_END:文件的大小+offset 文件的尾部
返回值:
- 错误 errno被设置
返回的是位置距离文件起始的字节数。
举例说明 lseek()的使用.代码参见 lseek.c 补充:
day07$od -tx1 -tc hello
6c 6c 6f 0a
h e l l o \n day07$vi hello
day07$od -tx1 -tc hello
6c 6c 6f 0a 6f 6c 0a
h e l l o \n w o r l d \n 二、使用mmap将文件映射到进程的虚拟地址空间,然后对内存的操
作直接反应到文件中。
将文件hello映射到内存,在内存中对文件的内容进行修改,改变实际文件的内容。
代码参见 mmap_file.c 三、文件的重定向
什么是文件的重定向?
我们讲述的文件是流式文件。操作的都是文件流。文件的重定向就是改变文件的流向。文件操作有两种流,输入流和输出流。
文件重定向分为文件输出重定向和文件输入重定向。
文件输出重定向。
完成文件描述符复制的两个系统调用
dup() dup2()
#include <unistd.h>
int dup(int oldfd);
功能:复制文件描述符
参数:
oldfd:源文件描述符
返回值:
- 错误 errno被设置
返回最小的、没有被使用的文件描述符 int dup2(int oldfd, int newfd);
功能:复制文件描述符
参数:
oldfd:源文件描述符
newfd:目的文件描述符
返回值:
- 错误 errno被设置
成功返回目的文件描述符 举例说明 使用dup()和dup2()实现文件的输出重定向。
代码参见 direct.c 四、文件锁的使用
文件锁分为两种 读锁(共享锁) 写锁(互斥锁)
文件对锁的实现分为两类 建议锁 强制锁
如何对文件加锁?
使用系统调用fcntl()对文件进行加锁。
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
功能:操作文件描述符
参数:
fd:指定要操控的文件描述符
cmd:指定了操作文件描述符的命令
建议锁使用的命令:
F_GETLK:用来测试是否可以加锁,如果可以加锁,返回F_UNLCK。
不可以加锁,在字段l_pid中保存了一个pid。是hold着这把锁的进程的pid。 F_SETLK:为文件描述符设置锁。如果有互斥锁,其他进程hold着互斥锁,立即返回-,错误,errno被设置 F_SETLKW:和F_SETLK一样,但是如果想要加的锁和文件已有记录锁冲突,进程阻塞等待其他进程对记录锁的释放。 ...: 可变参数,参数的类型和个数取决于cmd。
struct flock *
struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(F_GETLK only) */
...
}; 返回值:
成功
- 错误 errno被设置 举例说明文件锁的使用
有两个进程PA和PB,PA进程对文件加读锁,测试PB进程对同一个文件也加读锁,是否成功?
代码参见 PA.c PB.c 测试文件锁是否能添加。代码参见PC.c 五、库函数和系统调用之间的关系
以文件操作为例。
fopen fclose fputc fgetc 库函数
open close read write 系统调用 举例说明 代码参见 file.c FILE 是结构体类型的别名 flags fileno mode fopen()
首先调用open(),打开一个文件,将open()的返回值记录在FILE结构体中的_fileno成员。分配一块内存,这块空间叫文件内容缓冲区。然FILE中的一些指针成员指向这块内存。最后返回FILE类型的对象。 fputc()
调用fputc的时候,向文件内容缓冲区写数据。如果缓冲区没有空间接纳这个字符,调用write()将缓冲区的数据写入到文件中,然后再将fputc中的数据写入到缓冲区。如果缓冲有空间接纳数据,直接将数据写入缓冲区即可。 fgetc()
调用fgetc的时候,首先从缓冲区读取数据,如果缓冲区有数据,理解返回读取到的字节。如果缓冲区没有数据,调用read()从文件中读取数据 到缓冲区,然后fgetc了获取到数据才返回。 fclose()
首先刷新缓冲区,将缓冲区内存写入到文件中,然后调用close()关闭文件描述符,最后释放缓冲区。 库函数操作文件称为缓冲文件。
系统调用操作文件称为非缓冲文件 库函数可以跨平台 系统调用不能跨平台 总结:
一、lseek的使用
二、使用mmap将文件映射到内存,对内存的操作直接反应到文件中
三、文件输出重定向
四、文件锁的使用
五、库函数和系统调用之间的关系

dup、文件锁、库函数、函数调用(day07)的更多相关文章

  1. Linux文件锁学习-flock, lockf, fcntl

    参考  linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是f ...

  2. fcntl文件锁操作

    文件锁经常应用于两个方面:1.一是锁定文件中的临界数据,比如并发投票时文件记录的投票数2.二是利用具有互斥性质的写锁,实现进程的并发控制. /*使用文件锁*/<F5>#include &l ...

  3. C语言常见的函数调用

    C语言常见的函数调用 isatty,函数名,主要功能是检查设备类型,判断文件描述词是否为终端机. 函数名: isatty 用 法: int isatty(int desc); 返回值:如果参数desc ...

  4. 初级文件IO——IO过程、open、close、write、read、lseek、dup、dup2、errno、perror

    先要回答的问题 文件IO指的是什么? 本文主要讲述如何调用Linux OS所提供的相关的OS API,实现文件的读写. 如何理解文件IO? IO就是input output的意思,文件io就是文件输入 ...

  5. 文件锁-fcntl flock lockf

    这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文 ...

  6. C标准I/O库函数与Unbuffered I/O函数

    一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...

  7. C语言-两个库函数

    两个库函数 --1-- printf函数 1.1 printf 函数的介绍 1.2 格式控制字符串 1.3 %f输出精度的问题 1.4 printf 函数使用注意事项 --2-- scanf函数 2. ...

  8. iOS开发app启动原理及视图和控制器的函数调用顺序

    main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...

  9. 库函数系统调用文件方式,王明学learn

    库函数系统调用文件方式 基于C函数库的文件编程是独立于具体的操作系统平台的,不管是在Windows.Linux还是其他的操作系统中,都是使用这些函数.使用库函数进行程序设计可提高程序的可移植性. 对于 ...

随机推荐

  1. hdu1595find the longest of the shortest 最短路

    //给一个无向图,问删除一条边,使得从1到n的最短路最长 //问这个最长路 //这个删除的边必定在最短路上,假设不在.那么走这条最短路肯定比其它短 //枚举删除这条最短路的边,找其最长的即为答案 #i ...

  2. 南昌互联网行业协会筹办者祝真和华罡团队-2014年12月江西IDC排行榜

     他出自军营,拥有一身正气. 他在南昌创业,立意卓越. 从站点開始.到微营销.到线上教育,全面开花. 他在朋友圈看到不对的内容,就会即时批评. 他对朋友,又是很的和蔼可亲. 他就是南昌华罡网络创办 ...

  3. 最小堆min_stack

    class MinStack {public: void push(int x) { ele.push(x); if(min.empty()||x<=min.top())    // in or ...

  4. Exchange 2013 的会议室邮箱用户一直无法正常登陆。

    某客户使用了Exchange 2013 server作为邮件承载server.详细版本号为Exchange 2013 SP1. 如今客户有个需求,希望他们的邮箱作为会议室邮箱创建,并且必须有普通邮箱全 ...

  5. 为Chrome开发插件提高工作效率

    工作生活,什么最珍贵,我觉得是时间,怎么节约时间是一个最重要的问题,如果你有重复的工作在网页上,请接着看 上手步骤: 打开https://developer.chrome.com/extensions ...

  6. oc36--自定义构造方法在继承中的表现

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...

  7. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest

    2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...

  8. How to Integrate .NET Projects with Jenkins

    https://www.swtestacademy.com/jenkins-dotnet-integration/ 8) Unit Tests and Test Coverage Settings D ...

  9. ssdb底层实现——ssdb底层是leveldb,leveldb根本上是skiplist(例如为存储多个list items,必然有多个item key,而非暴力string cat),用它来做redis的list和set等,势必在数据结构和算法层面上有诸多不适

    我已经在用ssdb的hash结构,存储了很多数据了,但是我现在的用法正确吗? 我使用hash结构合理吗? 1. ssdb数据库说是类似redis,而且他们都有hash结构,但是他们的命名有点不同,ss ...

  10. 动态规划---区间dp

    今天写内网题,连着写了两道区间dp,这里就总结一下. 区间dp思想主要是先枚举f[i][j]中的i,再枚举j,再枚举一个1~j之间的变量k,一般是f[i][j] = max(f[i][j],f[i][ ...