《嵌入式linux程序开发》课程设计报告 fcntl()编程实现 联系客服

发布时间 : 星期一 文章《嵌入式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 #include #include #include #include #include #include \int main(void) {

int fd;

Page 8 of 15