一、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. Android LaunchAnyWhere (Google Bug 7699048)漏洞具体解释及防御措施

    開始 近日,Google修复一个组件安全的漏洞LaunchAnyWhere(Google Bug 7699048). 这个漏洞属于Intend Based提取漏洞,攻击者利用这个漏洞,能够突破了应用间 ...

  2. jvm的运行模式 client和 server两种

    jvm的运行模式 client和 server两种 学习了:https://www.cnblogs.com/fsjohnhuang/p/4270505.html 在jdk 9的情况下,好像没有clie ...

  3. [E2E] Visual Differing Tests with Puppeteer and PixelMatch

    Take your end to end tests to the next level by comparing your current application's view with an al ...

  4. Fragment进阶(四)-----&gt;參数传递3种写法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  5. MTK camera 闪光灯Flashlight驱动调试流程

    MTK camera 闪光灯Flashlight驱动调试流程 分类: MtkDev  |  作者: topicdev 相关  |  发布日期 : 2014-09-26  |  热度 : 153°   ...

  6. UESTC--1253--阿里巴巴和n个大盗 (博弈)

     阿里巴巴和n个大盗 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Submit St ...

  7. poj--1753--Flip Game(dfs好题)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37201   Accepted: 16201 Descr ...

  8. etcd数据备份与恢复验证

    一.单机 说明:执行etcd备份数据的恢复的机器必须和原先etcd所在机器一致 1.单机备份 etcdctl --endpoints="https://10.25.72.62:2379&qu ...

  9. Kubernetes Port Forward 机制访问 pod

    需求:研发需要调试部署的pod是否能正常提供访问,但又不对pod进行暴露到集群外. 实现:通过Kubernetes的Port Forward机制对本机端口映射到pod端口来实现 1.安装kubectl ...

  10. POJ 1172 DFS

    (感谢wzc学长的幻灯片) 单组数据 注意从必经点能到标记过的点则此点不是分裂点. //By: Sirius_Ren #include <cstdio> #include <queu ...