- 浏览: 152553 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 763最近项目好急,没时间整理,特做以下记录 去mysql网 ... -
red hat 安装svn
2012-03-23 16:34 1330素材: httpd-2.2.22.tar subve ... -
linux 当前shell指定java版本
2012-02-16 09:41 2908装了red hat 5.4,系统默认自带了Java 1.4, ... -
U盘安装red hat.
2012-02-09 10:50 1036没有DVD光盘和DVD光驱,悲剧啊,还好,网上有工具。 ... -
linux 下samba使用简介
2011-12-06 16:46 1111今天装了一台真正的linux主机(red hat),呵呵。安装 ... -
Shell学习
2011-11-30 17:32 753类unix操作系统中有b shell, k shell, c ... -
gdb调试linux0.11内核。
2011-11-26 16:13 15871. 下载bochs源码,配置,编译。 ./con ... -
red hat的远程桌面 xmanager
2011-11-04 14:49 3030用virtualbox装好red hat之后,我们可 ... -
virtual box中安装red hat并实现 ftp功能
2011-11-03 15:49 1740由于在公司上网,公司有个防火墙,安装虚拟主机需要虚 ... -
bochs调试linux 0.11内核
2011-07-01 15:24 6775学习操作系统,最难的就是 ... -
关于linux程序在内存中的分布管理
2011-05-27 10:54 1707这段时间,一直在看汇编,想学习一下li ... -
solaris mount细节
2011-04-11 14:33 10031. 首先确保 nfs server ... -
linux-gcc 编译时头文件和库文件搜索路径(转)
2011-03-11 11:16 1711一、头文件 gcc 在编译时寻找所需要的头文件 : ※ ... -
linux extern关键字的作用2
2011-03-09 17:13 1496extern int O_RDONLY; #includ ... -
GCC 参数详解(转载)
2011-03-01 10:29 1136gcc and g++分别是gnu的c &am ... -
linux extern关键字的作用
2011-02-25 17:28 2934extern 的作用是起到一个 ... -
linux 可执行文件依赖库查看
2011-02-25 12:24 5671在多线程编程中,我们用gcc -Wall -g ... -
c语言编译全过程(转)
2011-02-25 10:46 1218C语言编译全 ... -
linux库文件制作
2011-02-25 10:38 1057一、为什么要使用 ...
相关推荐
关于编译器,我们可以直接使用LINUX自带的make程序,但openFOAM又提供了一个编译程序wmake,它建立在make的基础上,但比make更强大和简单。并且wmake不仅可以用于openFOAM library,而且可以用于任何c++代码。 open...
文件系统**:虽然Linux包含了文件系统,但它本质上是一个操作系统。 - **B. 操作系统**:这是最准确的描述。 - **C. 数据库系统**:Linux并不是一个数据库系统。 - **D. 完整系统**:这个词不太准确描述Linux,尽管...
在Linux中,驱动程序和应用程序在结构上存在一些本质的不同。应用程序通常有一个main函数作为入口点,而驱动程序通常使用特殊的模块初始化函数作为入口。应用程序执行一个独立的任务完成后结束,而驱动程序在初始化...
Linux设备驱动程序本质上就是内核与外部设备之间的接口,它的作用在于隐藏硬件的具体实现细节,为应用程序提供统一的访问方式。 #### 设备文件的分类 Linux系统中的设备文件主要分为两类:字符设备和块设备。 1. ...
Linux下的设备驱动程序实质上是一组驻留在内存中的特殊低级硬件处理程序集合,它们作为系统内核与外围设备之间的桥梁,使操作系统能够有效地控制硬件资源。 #### Linux中设备驱动程序的基本结构 在Linux系统中,...
- 在`systemd`中,每个服务都有一个对应的单元文件(unit file),通常位于`/lib/systemd/system/`目录下。 - 单元文件定义了服务的各种属性,如启动命令、重启策略等。 - 用户可以通过编辑这些单元文件来修改服务...
最近在Linux下使用第三方库Protobuf时,遇到一个问题:可执行程序在运行时报错:“error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory”。...
命名规则是指在Linux字符设备驱动程序中,每个设备的驱动程序都有一组实质上相同的函数,这些函数需要添加至内核原码中以重新生成内核。为了防止不同驱动程序之间函数名的冲突,必须确保名称的唯一性,最好的方法是...
FILE* popen(const char *command, const char *open_mode); int pclose(FILE *stream_to_close); ``` - `popen(command, open_mode)`:`command`参数为要执行的命令及其参数,`open_mode`可以是`"r"`(只读)或`"w...
# Open the database file open (db, "human_kinases_swissprot.txt") || die "problem opening the file human_kinases_swissprot.txt\n"; # Search the database line by line while () { chomp; # Check if ...
用户通过标准的I/O函数(如open、write、read)与设备交互,其实质是调用了驱动程序提供的接口。 **主设备号与次设备号** 在Linux中,设备被唯一地识别通过主设备号和次设备号。主设备号标识了对应驱动程序,同一...
Linux驱动程序实质上是一组函数的集合,通过file_operations结构与文件系统相互作用,提供对设备的操作接口。对于HPI驱动程序,需要实现open、mmap等操作。 实现DSP的HPI驱动程序需要编写一系列操作函数。例如,...
它最初由Linux Torvalds于2005年开发,旨在支持Linux内核的开发工作。Git的核心优势在于其独特的数据存储方式,这使得Git与其他版本控制系统(如SVN)有着本质的区别。 - **数据存储方式**:Git将每次提交看作是一...
在Linux系统中,对文件的操作,无论是读取还是写入,本质上都是I/O操作。当用户执行一个写操作,比如将Word文档保存到硬盘时,这个过程会涉及到文件系统层面的多种操作。首先,用户态下的应用程序会通过系统调用陷入...
在探讨Linux服务器能负载多少个连接之前,首先要理解TCP连接的本质。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它基于四元组(src_ip, src_port, dst_ip, dst_port)来唯一识别一个...
管道本质上是在内存中开辟的一块缓冲区,并提供一对文件描述符供读写操作。它的工作原理如下: 1. **管道创建**:通常由父进程调用`pipe()`函数创建管道,此函数会返回两个文件描述符,分别用于读取和写入。 2. **...
with open('new_file.txt', 'w') as f: f.write('这是新的TXT内容') ``` **替换 TXT 文档内容** 替换 TXT 文档中的内容涉及读取原有文件,修改内容,然后重新写入。Python 中可以这样操作: ```python with open...
除此之外,还有针对文件属性和目录的其他系统调用,如file attributes和directory操作。 库函数,尤其是标准I/O库,提供了一种更高级、更方便的方式来处理文件操作。它们在系统调用的基础上封装了更多的功能,例如...