当前位置: 首页 > news >正文

网站做很多关键词做网站网页多少钱

网站做很多关键词,做网站网页多少钱,2023年中国500强榜单,临猗网站制作一、什么是文件锁定 对于锁这个字#xff0c;大家一定不会陌生#xff0c;因为我们生活中就存在着大量的锁#xff0c;它们各个方面发挥着它的作用#xff0c;现在世界中的锁的功能都可归结为一句话#xff0c;就是阻止某些人做某些事#xff0c;例如#xff0c;门锁就是… 一、什么是文件锁定 对于锁这个字大家一定不会陌生因为我们生活中就存在着大量的锁它们各个方面发挥着它的作用现在世界中的锁的功能都可归结为一句话就是阻止某些人做某些事例如门锁就是阻止除了屋主之外的人进入这个房子你进入不到这个房子也就不能使用房子里面的东西。 而因为程序经常需要共享数据而这通常又是通过文件来实现的试想一个情况A进程正在对一个文件进行写操作而另一个程序B需要对同一个文件进行读操作并以读取到的数据作为自己程序运行时所需要的数据这会发生什么情况呢进程B可能会读到错乱的数据因为它并不知道另一个进程A正在改写这个文件中的数据。 为了解决类似的问题就出现了文件锁定简单点来说这是文件的一种安全的更新方式当一个程序正在对文件进行写操作时文件就会进入一种暂时状态在这个状态下如果另一个程序尝试读这个文件它就会自动停下来等待这个状态结束。Linux系统提供了很多特性来实现文件锁定其中最简单的方法就是以原子操作的方式创建锁文件。 用回之前的例子就是文件锁就是当文件在写的时候阻止其他的需要写或者要读文件的进程来操作这个文件。 二、创建锁文件 创建一个锁文件是非常简单的我们可以使用open系统调用来创建一个锁文件在调用open时oflags参数要增加参数O_CREAT和O_EXCL标志如file_desc open(/tmp/LCK.test, O_RDWR|O_CREAT|O_EXCL, 0444);就可以创建一个锁文件/tmp/LCK.test。O_CREAT|O_EXCL可以确保调用者可以创建出文件使用这个模式可以防止两个程序同时创建同一个文件如果文件/tmp/LCK.test已经存在则open调用就会失败返回-1。 如果一个程序在它执行时只需要独占某个资源一段很短的时间这个时间段或代码区通常被叫做临界区我们需要在进入临界区之前使用open系统调用创建锁文件然后在退出临界区时用unlink系统调用删除这个锁文件。 注意锁文件只是充当一个指示器的角色程序间需要通过相互协作来使用它们也就是说锁文件只是建议锁而不是强制锁并不会真正阻止你读写文件中的数据。 可以看看下面的例子源文件文件名为filelock1.c代码如下 #include unistd.h #include stdlib.h #include stdio.h #include fcntl.h #include errno.hint main() {const char *lock_file /tmp/LCK.test1;int n_fd -1;int n_tries 10;while (n_tries--){// 创建锁文件n_fd open(lock_file, O_RDWR | O_CREAT | O_EXCL, 0444);if (n_fd -1){// 创建失败printf(%d - Lock already present\n, getpid());sleep(2);}else{// 创建成功printf(%d - I have exclusive access\n, getpid());sleep(1);close(n_fd);// 删除锁文件释放锁unlink(lock_file);sleep(2);}}return 0; } 同时运行同一个程序的两个实例运行结果为 从运行的结果可以看出两个程序交叉地对对文件进行锁定但是真实的操作却是每次调用open函数去检查/tmp/LCK.test1这个文件是否存在如果存在open调用就失败显示有进程已经把这个文件锁定了如果这个文件不存在就创建这个文件并显示许可信息。但是这种做法有一定的缺憾我们可以看到文件/tmp/LCK.test1被创建了很多次也被unlink删除了很多次也就是说我们不能使用已经事先有数据的文件作为这种锁文件因为如果文件已经存在则open调用总是失败。 给我的感觉是这更像是一种对进程工作的协调性安排更像是二进制信号量的作用文件存在为0不存在为1而不是真正的文件锁定。 三、区域锁定 我们还有一个问题就是如果同一个文件有多个进程需要对它进行读写而一个文件同一时间只能被一个进程进行写操作但是多个进程读写的区域互不相关如果总是要等一个进程写完其他的进程才能对其进行读写效率又太低那么是否可以让多个进程同时对文件进行读写以提高数据读写的效率呢 为了解决上面提到的问题和出现在第二点中的问题即不能把文件锁定到指定的已存在的数据文件上的问题我们提出了一种新的解决方案就是区域锁定。 简单点来说区域锁定就是文件中的某个部分被锁定了但其他程序可以访问这个文件中的其他部分。 然而区域锁定的创建和使用都比上面说的文件锁定复杂很多。 1、创建区域锁定 在Linux上为实现这一功能我们可以使用fcntl系统调用和lockf调用但是下面以fcntl系统调用来讲解区域锁定的创建。 fctnl的函数原型为 int fctnl(int fildes, int command, struct flock *flock_st); 它对一个打开的文件描述进行操作并能根据command参数的设置完成不同的任务它有三个可选的任务F_GETLKF_SETLK,F_SETLKW至于这三个参数的意义下面再详述。而当使用这些命令时fcntl的第三个参数必须是一个指向flock结构的指针。 2、flock结构 准确来说flock结构依赖具体的实现但是它至少包括下面的成员 short l_type文件锁的类型对应于F_RDLCK读锁也叫共享锁F_UNLCK解锁也叫清除锁F_WRLCK写锁也叫独占锁中的一个。 short l_whence从文件的哪个相对位置开始计算对应于SEEK_SET文件头SEEK_CUR当前位置SEEK_END(文件尾中的一个。 off_t l_start从l_whence开始的第l_start个字节开始计算。 off_t l_len锁定的区域的长度。 pid_t l_pid用来记录参持有锁的进程。 成员l_whence、l_start和l_len定义了一个文件中的一个区域即一个连续的字节集合例如 struct flock region; region.l_whence SEEK_SET; region.l_start 10; region.l_len 20;则表示fcntl函数操作锁定的区域为文件头开始的第10到29个字节之间的这20个字节。 3、文件锁的类型 从上面的flock的成员l_type的取值我们可以知道文件锁的类型主要有三种这里对他们进行详细的解说。 F_RDLCK 从它的名字我们就可以知道它是一个读锁也叫共享锁。许多不同的进程可以拥有文件同一或重叠区域上的读共享锁。而且只要任一进程拥有一把读共享锁那么就没有进程可以再获得该区域上的写独占锁。为了获得一把共享锁文件必须以“读”或“读/写”方式打开。 简单点来说就是当一个进程在读文件中的数据时文件中的数据不能被改变或改写这是为了防止数据被改变而使读数据的程序读取到错乱的数据而文件中的同一个区域能被多个进程同时读取这是容易理解的因为读不会破坏数据或者说读操作不会改变文件的数据。 F_WRLCK 从它的名字我们就可以知道它是一个写锁也叫独占锁。只有一个进程可以在文件中的任一特定区域拥有一把写独占锁。一旦一个进程拥有了这样一把锁任何其他进程都无法在该区域上获得任何类型的锁。为了获得一把写独占锁文件也必须以“读”或“读/写”方式打开。 简单点来说就是一个文件同一区域或重叠区域进在同一时间只能有一个进程能对其进行写操作并且在写操作进行期间其他的进程不能对该区域进行读取数据。这个要求是显然易见的因为如果两个进程同时对一个文件进行写操作就会使文件的内容错乱起来而由于写时会改变文件中的数据所以它也不允许其他进程对文件的数据进行读取和删除文件等操作。 F_UNLCK 从它的名字就可以知道它用于把一个锁定的区域解锁。 4、不同的command的意义 在前面说到fcntl函数的command参数时说了三个命令选项这里将对它们进行详细的解说。 F_GETLK命令 它用于获取fildesfcntl的第一个参数打开的文件的锁信息它不会尝试去锁定文件调用进程可以把自己想创建的锁类型信息传递给fcntl函数调用就会返回将会阻止获取锁的任何信息即它可以测试你想创建的锁是否能成功被创建。fcntl调用成功时返回非-1如果锁请求可以成功执行flock结构将保持不变如果锁请求被阻止fcntl会用相关的信息覆盖flock结构。失败时返回-1。 所以如果调用成功调用程序则可以通过检查flock结构的内容来判断其是否被修改过来检查锁请求能否被成功执行而又因为l_pid的值会被设置成拥有锁的进程的标识符所以大多数情况下可以通过检查这个字段是否发生变化来判断flock结构是否被修改过。 使用F_GETLK的fcntl函数调用后会立即返回。 举个例子来说例如有一个flock结构的变量flock_st,flock_st.l_pid -1文件的第10~29个字节已经存在一个读锁文件的第40~49个字节中已经存在一个写锁则调用fcntl时如果用F_GETLK命令来测试在第10~29个字节中是否可以创建一个读锁因为这个锁可以被创建所以fcntl返回非-1同时flock结构的内容也不会改变flock_st.l_pid -1。而如果我们测试第40~49个字节中是否可以创建一个写锁时由于这个区域已经存在一个写锁测试失败但是fcntl还是会返回非-1只是flock结构会被这个区域相关的锁的信息覆盖了flock_st.l_pid为拥有这个写锁的进程的进程标识符。 F_SETLK命令 这个命令试图对fildes指向的文件的某个区域加锁或解锁它的功能根据flock结构的l_type的值而定。而对于这个命令来说flock结构的l_pid字段是没有意义的。如果加锁成功返回非-1如果失败则返回-1。使用F_SETLK的fcntl函数调用后会立即返回。 F_SETLKW命令 W 表示 wait 这个命令与前面的F_SETLK命令作用相同但不同的是它在无法获取锁时即测试不能加锁时会一直等待直到可以被加锁为止。 5、例子 看了这么多的说明可能你已经很乱了就用下面的例子来整清你的思想吧。 源文件名为filelock2.c用于创建数据文件并将文件区域加锁代码如下 #include fcntl.h #include stdio.h #include stdlib.h #include unistd.hint main(int argc, char **argv) {const char *test_file ./test_lock.txt;int file_desc -1;int byte_count 0;char *byte_to_write A;struct flock region_1;struct flock region_2;int res 0;// 打开一个文件m描述符file_desc open(test_file, O_RDWR|O_CREAT, 0666);if (!file_desc){fprintf(stderr, Unable to open %s for read/write\n, test_file);exit(EXIT_FAILURE);}// 给文件添加 100个 A字符的数据for (byte_count 0; byte_count 100; byte_count){write(file_desc, byte_to_write, 1);}// 在文件的第 10~29 字节设置读锁(共享锁)region_1.l_type F_RDLCK;region_1.l_whence SEEK_SET;region_1.l_start 10;region_1.l_len 20;// 在文件的 40~49 字节设置写锁(独占锁)region_2.l_type F_WRLCK;region_2.l_whence SEEK_SET;region_2.l_start 40;region_2.l_len 10;printf(Process %d locking file\n, getpid());// 锁定文件res fcntl(file_desc, F_SETLK, region_1);if (res -1){fprintf(stderr, Failed to lock region 1\n);}res fcntl(file_desc, F_SETLK, region_2);if (res -1){fprintf(stderr, Failed to lock regin 2\n);}// 让程序休眠1分钟, 用于测试sleep(60);printf(Process %d closing file\n, getpid());close(file_desc);exit(EXIT_SUCCESS); } 下面的源文件filelock3.c用于测试上一个文件设置的锁测试可否对两个区域都加上一个读锁代码如下 #include fcntl.h #include stdio.h #include stdlib.h #include unistd.hint main(int argc, char **argv) {const char *test_file ./test_lock.txt;int file_desc -1;int res 0;// 打开数据文件file_desc open(test_file, O_RDWR|O_CREAT, 0666);if (!file_desc){fprintf(stderr, Unable to open %s for read/write, test_file);exit(EXIT_FAILURE);}// 设置区域1的锁类型struct flock region_test1;region_test1.l_type F_RDLCK;region_test1.l_whence SEEK_SET;region_test1.l_start 10;region_test1.l_len 20;region_test1.l_pid -1;// 设置区域2的锁类型struct flock region_test2;region_test2.l_type F_RDLCK;region_test2.l_whence SEEK_SET;region_test2.l_start 40;region_test2.l_len 10;region_test2.l_pid -1;// 对区域1的是否可以加一个读锁进行测试res fcntl(file_desc, F_GETLK, region_test1);if (res -1){fprintf(stderr, Failed to get RDLCK\n);}if (region_test1.l_pid -1){// 可以加一个读锁printf(test: Process %d could lock\n, getpid());}else{// 不允许加一个读锁printf(test:Process %d get lock failure\n, getpid());}// 对q区域2是否可以加一个读锁进行测试res fcntl(file_desc, F_GETLK, region_test2);if (res -1){fprintf(stderr, Failed to get RDLCK\n);}if (region_test2.l_pid -1){// 可以加一个读锁printf(test: Process %d could lock\n, getpid());}else{// 不允许加一个锁printf(test:Process %d get lock failure\n, getpid());}exit(EXIT_SUCCESS); } 运行结果如下 因为区域1中存在的是读锁所以在其之上再加一个读锁是可以成功的然而区域2上存在的锁是写锁在其上不能加任何类型的锁所以测试失败。注意测试失败并不是fctnl调用失败它还是返回非-1我们是通过检查flock结构的成员l_pid来确定测试结果的。 三、解空锁问题 如果我要给在本进程中没有加锁的区域解锁会发生什么事情呢而如果这个区域中其他的进程有对其进行加锁又会发生什么情况呢 如果一个进程实际并未对一个区域进行锁定而调用解锁操作也会成功但是它并不能解其他的进程加在同一区域上的锁。也可以说解锁请求最终的结果取决于这个进程在文件中设置的任何锁没有加锁但对其进行解锁得到的还是没有加锁的状态。     参考 Linux C fcntl函数详解 http://blog.csdn.net/ljianhui/article/details/10075795 《Linux 高性能服务器编程》 转载于:https://www.cnblogs.com/52php/p/5811965.html
http://www.yutouwan.com/news/466474/

相关文章:

  • 网站开发资源网广西南宁建设银行最新招聘网站
  • 兰州企业网站建设多少钱企业名录搜索软件下载
  • 做网站软件有哪些东营网站排名
  • 青海省建设厅网站执业seo课程心得体会
  • 网站建设网站需要什么软件网站首页制作的过程
  • 湖南响应式网站方案简单学生的网页代码
  • 网站建设含义百度霸屏全网推广
  • 网站开发有什么好的命题自己搭建app托管平台
  • 好模版网站网站一键备份
  • 深圳有哪些做网站的公司门户网站后台
  • 微网站的建设第一步是什么php语言做网站
  • 慈溪网站制作哪家最便宜网站svg使用
  • 南浔区住房和城乡建设网站杭州vi设计广告公司
  • 江西专业南昌网站建设全国最缺工100个职业表
  • 网站后期维护个人建站怎么做网站好
  • 建立网站ftp是什么个人网站备案名字不同
  • 老鸭窝网站正在建设中房产网站门户系统
  • 简单建优化网站无需技术线上宣传渠道和宣传方式
  • linux wordpress建站教程电子商务主要做什么
  • 门户网站的建设原理青海集团网站建设
  • 北京网站建设价位怎样在百度免费做网站
  • 建设银行信用卡网站是哪个海外红人营销推广
  • 用h5做网站是什么意思网站建设公司 提成
  • 公司网站的制作公司网页设计师在什么公司工作
  • 好孩子官方网站王建设余姚网站公司
  • 手机app网站模板下载兰州网站排名外包
  • 网站建设项目目标描述网站做百度地图怎么做呢
  • 广告传媒公司的网站应该怎么做网站开发好不好
  • 江苏建科建设监理有限公司网站网站关键词优化排名软件系统
  • 网站seo优化要怎么做h5网站开发流程图