当前位置:首页 > 《嵌入式linux程序开发》课程设计报告 fcntl()编程实现
《嵌入式linux程序开发》课程设计报告 fcntl()编程实现Ⅰ 陈丽丹 07323202
ⅶ 开发应用程序
可以下载到根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于UCOS-II的方式。
ⅷ 烧写内核、根文件系统、应用程序
四.课程设计目的和要求
通过编写在多用户共享下给文件上锁的程序,进一步熟悉Linux中文件I/O相关的应用开发,并且熟练的掌握fentl()函数的使用。
在文件已经共享的情况下如何操作,也就是当多个用户共同使用、操作一个文件的情况,这时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。
文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在
在Linux中,实现文件上锁的函数有lock和fcntl,其中flock用于对文件施加建议性锁,而fcntl不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。
记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。
fcntl函数格式
? fcntl函数原型
int fcnt1(int fd,int cmd,struct flock *lock)
参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。
参数lock指针为flock 结构指针,定义如下: struct flcok
{
short int l_type; short int l_whence; off_t l_start; off_t l_len;
Page 5 of 15
《嵌入式linux程序开发》课程设计报告 fcntl()编程实现Ⅰ 陈丽丹 07323202 pid_t l_pid; };
l_type 有三种状态:
F_RDLCK 建立一个供读取用的锁定 F_WRLCK 建立一个供写入用的锁定 F_UNLCK 删除之前建立的锁定 l_whence 也有三种方式:
SEEK_SET 以文件开头为锁定的起始位置。
SEEK_CUR 以目前文件读写位置为锁定的起始位置 SEEK_END 以文件结尾为锁定的起始位置。
返回值 成功则返回0,若有错误则返回-1,错误原因存于errno。
程序流程图:
开始 开始 文件是否已上锁? 文件是否成功已上锁 未上锁 成功 给文件置写入锁/读取锁并给出提示。如:进程号 解锁 失败 提示上锁失败,并显示已上什么锁和上锁的进程号 提示上锁成功,并显示上了什么和上锁的进程号 给出打开文件失败的提示 结束 结束
图1.文件记录锁功能流程图 图2. 文件写入锁/读取锁功能流程图
Page 6 of 15
《嵌入式linux程序开发》课程设计报告 fcntl()编程实现Ⅰ 陈丽丹 07323202
五.VI简介与源程序
vi 是Linux/Unix 世界里极为普遍的可视化的全屏幕文本编辑器(visual edit),几乎可以说任何一台Linux/Unix 机器都会提供这个软件。
vi 有三种状态,即编辑方式,插入方式和命令方式。在命令方式下,所有命令都要以:开始,所键入的字符系统均作命令来处理,如:q 代表退出,:w 表示存盘。当你进入vi 时,会首先进入命令方式(同时也是编辑方式)。按下i 就进入插入方式,用户输入的可视字符都添加到文件中,显示在屏幕上。按下ESC
就可以回到命令状态(同时也是编辑方式)。
源程序:
/* lock_set.c */
int lock_set(int fd, int type) {
struct flock old_lock, lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = type; lock.l_pid = -1;
/* 判断文件是否可以上锁 */ fcntl(fd, F_GETLK, &lock); if (lock.l_type != F_UNLCK) {
/* 判断文件不能上锁的原因 */
if (lock.l_type == F_RDLCK) /* 该文件已有读取锁 */ {
printf(\ }
else if (lock.l_type == F_WRLCK) /* 该文件已有写入锁 */ {
printf(\
Page 7 of 15
《嵌入式linux程序开发》课程设计报告 fcntl()编程实现Ⅰ 陈丽丹 07323202
} }
/* l_type 可能已被F_GETLK修改过 */ lock.l_type = type;
/* 根据不同的type值进行阻塞式上锁或解锁 */ if ((fcntl(fd, F_SETLKW, &lock)) < 0) {
printf(\ return 1; }
switch(lock.l_type) {
case F_RDLCK: {
printf(\ }
break;
case F_WRLCK: {
printf(\ }
break;
case F_UNLCK: {
printf(\ return 1; }
break; default: break;
}/* end of switch */ return 0; }
/* read_lock.c */ #include
int fd;
Page 8 of 15
共分享92篇相关文档