- 浏览: 149362 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lanhaitun1991:
亲,其实你这里介绍的方法有一个最大的问题:如果放入队列之后,但 ...
分布式事务 -
lp385267935:
不错 很好用~3Q
jsonlib json-->object,忽略object中没有的属性 -
xiebo1983:
http://www.sqkoo.com/show/detai ...
mysql latin1乱码 -
envy2002:
当然可以了,tomcat中源码你可以看看,只要“欺骗”过去to ...
tomcat中的长连接 -
newSaa:
问一下,可以在 tomcat 建立tcp 长连接吗?
tomcat中的长连接
linux open file的时候到底做了什么呢?
如图:
这样多线程对文件读写,可见,也是需要对文件进行同步保护的。
但是这和内存变量的同步似乎有些不太一样,也就是用mutex好像不能互斥文件open之后的读写吧?
看来需要锁这个东西,它的机制和内存锁mutex应该是一样的吧,猜测的!希望后面能看到例子。
代码保存一下:
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main(int argc, char **argv) { int file_id1=open("test.txt",O_RDWR); if(file_id1<0) printf("open file_id_1 is error\n"); printf("file_id_1 is %d\n",file_id1); int file_id2=open("test.txt",O_RDWR); if(file_id2<0) printf("open file_id_2 is error\n"); printf("file_id_2 is %d\n",file_id2); // int jump_length=lseek(file_id1,10,SEEK_SET); //sleep(60); char buffer1[128]={0}; char buffer2[128]={0}; int length1= read(file_id1,buffer1,10); printf("length1 %d\n",length1); printf("content1 %s\n",buffer1); char * write_string="######"; write(file_id1,write_string,strlen(write_string)); int length2= read(file_id1,buffer2,20); printf("length2 %d\n",length2); printf("content2 %s\n",buffer2); return 0; }
2. 文件的锁。文件的锁从进程的视角来锁定某个文件。
函数int lockf(int fie_id, int function,int length);
file_id 为要锁定文件的文件标示符,function可以取以下参数
F_ULOCK 为一个先前锁定的区域解锁
F_LOCK 锁定一个区域
F_TLOCK 测试并锁定一个区域
F_TEST 测试一个区域是否已经上锁。
这个锁的机制和内存的锁定机制是极其类似的,所以我们直接上代码:
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main(int argc, char **argv) { int file_id1=open("test.txt",O_RDWR); if(file_id1<0) printf("open file_id_1 is error\n"); printf("file_id_1 is %d\n",file_id1); int file_id2=open("test.txt",O_RDWR); if(file_id2<0) printf("open file_id_2 is error\n"); printf("file_id_2 is %d\n",file_id2); // int jump_length=lseek(file_id1,10,SEEK_SET); //sleep(60); char buffer1[128]={0}; char buffer2[128]={0}; lockf(file_id1,F_LOCK,10L); int length1= read(file_id1,buffer1,10); printf("length1 %d\n",length1); printf("content1 %s\n",buffer1); sleep(20); /* char * write_string="######"; write(file_id1,write_string,strlen(write_string)); int length2= read(file_id1,buffer2,20); printf("length2 %d\n",length2); printf("content2 %s\n",buffer2); */ return 0; }
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main(int argc, char **argv) { int file_id1=open("test.txt",O_RDWR); if(file_id1<0) printf("open file_id_1 is error\n"); printf("file_id_1 is %d\n",file_id1); int file_id2=open("test.txt",O_RDWR); if(file_id2<0) printf("open file_id_2 is error\n"); printf("file_id_2 is %d\n",file_id2); int jump_length=lseek(file_id1,10,SEEK_SET); //sleep(60); char buffer1[128]={0}; char buffer2[128]={0}; lockf(file_id1,F_LOCK,10L); int length1= read(file_id1,buffer1,10); printf("length1 %d\n",length1); printf("content1 %s\n",buffer1); sleep(20); /* char * write_string="######"; write(file_id1,write_string,strlen(write_string)); int length2= read(file_id1,buffer2,20); printf("length2 %d\n",length2); printf("content2 %s\n",buffer2); */ return 0; }
先运行fork.c,fork.c会锁定test.txt文件,如果锁到和fork2进程操作的test.txt的同一个位置,那么会阻塞fork2进程。
效果图:
这里有个问题是,文件是可以被多个进程访问的,但是如果我们的进程如果不用lockf的话是可以访问到,读写任何文件的,但是其实比如有些程序是不想让其他文件在自己修改的同时,被其他程序修改的,这时,我们可以利用F_TEST参数来测试
这个文件是否被其他进程lock,如果这个文件被其他进程lock,则函数 int result=flock(file_id, F_TEST, 0L); 会返回-1,如果没有锁定的位置相交,则返回0;
这时我们可以适度加锁,来避免和别的进程来争抢资源。
发表评论
-
tomcat停止
2012-04-18 12:50 0#!/bin/sh #kill tomcat pid ... -
ubuntu 装mysql
2012-04-12 13:37 737最近项目好急,没时间整理,特做以下记录 去mysql网 ... -
red hat 安装svn
2012-03-23 16:34 1288素材: httpd-2.2.22.tar subve ... -
linux 当前shell指定java版本
2012-02-16 09:41 2874装了red hat 5.4,系统默认自带了Java 1.4, ... -
U盘安装red hat.
2012-02-09 10:50 1007没有DVD光盘和DVD光驱,悲剧啊,还好,网上有工具。 ... -
linux 下samba使用简介
2011-12-06 16:46 1086今天装了一台真正的linux主机(red hat),呵呵。安装 ... -
Shell学习
2011-11-30 17:32 731类unix操作系统中有b shell, k shell, c ... -
gdb调试linux0.11内核。
2011-11-26 16:13 15451. 下载bochs源码,配置,编译。 ./con ... -
red hat的远程桌面 xmanager
2011-11-04 14:49 2981用virtualbox装好red hat之后,我们可 ... -
virtual box中安装red hat并实现 ftp功能
2011-11-03 15:49 1700由于在公司上网,公司有个防火墙,安装虚拟主机需要虚 ... -
bochs调试linux 0.11内核
2011-07-01 15:24 6737学习操作系统,最难的就是 ... -
关于linux程序在内存中的分布管理
2011-05-27 10:54 1676这段时间,一直在看汇编,想学习一下li ... -
solaris mount细节
2011-04-11 14:33 9781. 首先确保 nfs server ... -
linux-gcc 编译时头文件和库文件搜索路径(转)
2011-03-11 11:16 1682一、头文件 gcc 在编译时寻找所需要的头文件 : ※ ... -
linux extern关键字的作用2
2011-03-09 17:13 1467extern int O_RDONLY; #includ ... -
GCC 参数详解(转载)
2011-03-01 10:29 1098gcc and g++分别是gnu的c &am ... -
linux extern关键字的作用
2011-02-25 17:28 2893extern 的作用是起到一个 ... -
linux 可执行文件依赖库查看
2011-02-25 12:24 5640在多线程编程中,我们用gcc -Wall -g ... -
c语言编译全过程(转)
2011-02-25 10:46 1181C语言编译全 ... -
linux库文件制作
2011-02-25 10:38 1025一、为什么要使用 ...
相关推荐
Linux File Systems for Windows by Paragon Software is a unique tool which gives you full access to Linux volumes within Windows. Just plug your hard disk with ExtFS/Btrfs/XFS partitions into your PC...
破解简单密码 亲自高度运行,可以运行, 但有些文件可以破解 ,有些文件破解不了。
fileopen插件,用于打开fileopen加密的文件,64位,支持win7、win8、win10
linux file 命令源代码,5.08版本
linux file 命令能识别文件的类型,而不需要后缀名来识别。本文档是他的源代码,需要分析linux文件类型的朋友可以参考。
linux源码部分内容,与file操作相关
修改linux进程可打开的文件数的限制open files linux中一切都是文件 默认linux一个进程可打开1024个文件 大并发需要达到5万个文件描述符FD,你必须修改该参数值才行
最近用到linux的file命令源码,保存。压缩包内有file-5.04.tar.gz和file-5.40.tar.gz两个版本。
Advanced PDF Password Recovery v1.31.48.35 (supports FileOpen DRM removal).zipAdvanced PDF Password Recovery v1.31.48.35 (supports FileOpen DRM removal).zipAdvanced PDF Password Recovery v1.31.48.35 ...
Linux File System Structure (Filed, File, DataBase Record)
Linux命令file命令
some java dll open source file
OpenFile.ashx
linux系统下一切皆文件,上传比较详细的文件操作fopen,open,,,,
linux virtual file system
openfile 与iscsi图形安装教程
Open File的应用(C#代码编写) Open File的应用 QQ223857666勾月
mfxwin32_openfile
基于linux的文件操作程序.包括file_cp file_create file_open等
mysql错误can't open file