一、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. Linux(1):fork函数

    ps:每一篇博客不过为了记录学习的过程,并反思总结,如有错误,还望指正. 函数原型:extern __pid_t fork (void) __THROWNL; 该函数包括于头文件unistd.h中. ...

  2. 在win10下改变默认的输入法切换Ctrl+Space

    在win10下改变默认的输入法切换Ctrl+Space 学习了:https://www.zhihu.com/question/22288432 在win10下面,有两种风格的控制面板设置: 在输入法上 ...

  3. Redis 3.0.0 正式版出炉,高性能 K/V 服务

    Redis 3.0.0 正式版最终到来了,与 RC6 版本号比較.该版本号改进包含: * 修复了无磁盘的复制问题 (Oran Agra) * 在角色变化后对 BLPOP 复制进行測试 (Salvato ...

  4. PHP5+标准函数库观察者之实现

    PHP的观察者设计模式实现相对简单,可是PHP5+版本号中已经有标准库类库支持,我们仅仅需简单继承并实现就能够了. 观察者:实现标准接口类库SplSubject. 一个注冊方法:attach.一个取消 ...

  5. [RK3288][Android6.0] 调试笔记 --- 系统第一次开机进入Recovery模式原因【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/53464461 latform: ROCKCHIPOS: Android 6.0Kernel: ...

  6. 窗口函数 SELECT - OVER Clause (Transact-SQL)

    https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql Determines the pa ...

  7. C#如何读写和创建INI文件(经典)转

    C#如何读写和创建INI文件 分类: c#程序设计2011-11-27 20:42 4935人阅读 评论(2) 收藏 举报 inic#stringbuffernullfile 在做项目过程中,有时需要 ...

  8. suse的安装命令zypper,类似apt

    例子:添加11.3的官方软件和升级源zypper ar http://download.opensuse.org/distribution/11.3/repo/oss/ mainzypper ar h ...

  9. Coursera Algorithms week2 基础排序 练习测验: Intersection of two sets

    题目原文: Given two arrays a[] and b[], each containing n distinct 2D points in the plane, design a subq ...

  10. Moco模拟服务器实现请求&响应 (一)

    接口测试Moco工具 1.使用Moco模拟,首先需要下载Moco 的jar 包,下载链接: http://central.maven.org/maven2/com/github/dreamhead/m ...