Linux 基本语句_8_C语言_文件控制

这篇具有很好参考价值的文章主要介绍了Linux 基本语句_8_C语言_文件控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为了解决多个进程同时操作一个文件,产生一些情况,通常对文件进行上锁,已解决对共享文件的竞争

对打开文件进行各种操作:

int fcentl(int fd, int cmd, .../*arg*/

如果cmd与锁操作有关,那么fcentl函数的第三个参数就要传入一个结构体

Linux 基本语句_8_C语言_文件控制,linux,c语言,运维
Linux 基本语句_8_C语言_文件控制,linux,c语言,运维
其中结构体如下:

 struct flock {
               ...
               short l_type;    /* Type of lock: F_RDLCK,
                                   F_WRLCK, F_UNLCK */
               short l_whence;  /* How to interpret l_start:
                                   SEEK_SET, SEEK_CUR, SEEK_END */
               off_t l_start;   /* Starting offset for lock */
               off_t l_len;     /* Number of bytes to lock */
               pid_t l_pid;     /* PID of process blocking our lock
                                   (F_GETLK only) */
               ...
           };

Linux 基本语句_8_C语言_文件控制,linux,c语言,运维
Linux 基本语句_8_C语言_文件控制,linux,c语言,运维

利用fcntl函数解决两个终端同时写访问一个文件产生的竞争问题:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/file.h> 

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("Read lock already set by %d\n", lock.l_pid);
	   }
	   else if(lock.l_type == F_WRLCK){
	   	printf("Write lock already set by %d\n", lock.l_pid);
	   } 
	} 
	
	/*上述可能由于不是解锁状态l_type被设置成了相应的锁值下方进行上锁操作时要再次调用type*/ 
	lock.l_type = type;
	
	if((fcntl(fd, F_SETLKW, &lock)) < 0){//上锁失败 
		printf("Lock failed:type  = %d\n", lock.l_type);
		return -1;
	}
	
	switch(lock.l_type){
		case F_RDLCK:
			printf("Read lock set by %d\n", getpid());//获取当前进程的ID
			break;
		case F_WRLCK:
		    printf("Write lock set by %d\n", getpid());
	        break;
		case F_UNLCK:
		    printf("Release lock by %d\n", getpid());//解锁返回1 
			return 1;
			break; 
	}
	
	return 0;//上锁返回0 
}

int main(int argc, const char * argv[]){
	int fd;
	
	if((fd = open("test.txt", O_RDWR)) < 0){
		printf("open error\n");
		return -1;
	}
	
	lock_set(fd, F_WRLCK);//设置写入锁
	getchar();//等待响应 
	lock_set(fd, F_UNLCK);//解锁
	getchar();
	close(fd);
	return 0; 
}

为了更好演示,将写访问改成读访问,读访问可以多进程同时进行:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/file.h> 

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("Read lock already set by %d\n", lock.l_pid);
	   }
	   else if(lock.l_type == F_WRLCK){
	   	printf("Write lock already set by %d\n", lock.l_pid);
	   } 
	} 
	
	/*上述可能由于不是解锁状态l_type被设置成了相应的锁值下方进行上锁操作时要再次调用type*/ 
	lock.l_type = type;
	
	if((fcntl(fd, F_SETLKW, &lock)) < 0){//上锁失败 
		printf("Lock failed:type  = %d\n", lock.l_type);
		return -1;
	}
	
	switch(lock.l_type){
		case F_RDLCK:
			printf("Read lock set by %d\n", getpid());//获取当前进程的ID
			break;
		case F_WRLCK:
		    printf("Write lock set by %d\n", getpid());
	        break;
		case F_UNLCK:
		    printf("Release lock by %d\n", getpid());//解锁返回1 
			return 1;
			break; 
	}
	
	return 0;//上锁返回0 
}

int main(int argc, const char * argv[]){
	int fd;
	
	if((fd = open("test.txt", O_RDWR)) < 0){
		printf("open error\n");
		return -1;
	}
	
	lock_set(fd, F_RDLCK);//设置写入锁
	getchar();//等待响应 
	lock_set(fd, F_UNLCK);//解锁
	getchar();
	close(fd);
	return 0; 
}

效果:两进程一起访问
Linux 基本语句_8_C语言_文件控制,linux,c语言,运维

c语言strlen与sizeof函数的区别:文章来源地址https://www.toymoban.com/news/detail-725310.html

char a[32]
a[32] = "abcd";
strlen(a) = 4;
sizeof(a) = 32;

到了这里,关于Linux 基本语句_8_C语言_文件控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【linux 脚本篇】流程控制语句-case

    【linux 脚本篇】流程控制语句-case

    目录 🍁案例一:菜单选项 🍂if语句执行 🍂case语句执行 🍁案例二:rsync服务脚本 🍂if语句执行 🍂case语句执行 🍁案例三:nginx服务脚本 🍁案例四:实现系统工具箱 🍁案例五:实现简单的jumpserver跳板机     🦐博客主页:大虾好吃吗的博客     🦐专栏地址:Linux从入门

    2024年02月07日
    浏览(11)
  • 【Linux脚本篇】流程控制语句-if

    【Linux脚本篇】流程控制语句-if

    目录 🍁流程控制语句if 🍂单分支语句 🍂双分支语句 🍂多分支语句 🍁流程控制语句:文件比较 🍁流程控制语句:整数比对 🍁流程控制语句:字符对比 🍁正则表达式 🍁流程控制语句:正则比对,使用[[]]    🦐博客主页:大虾好吃吗的博客    🦐专栏地址:Linux从入

    2024年02月06日
    浏览(13)
  • Linux 基本语句_16_Udp网络聊天室

    Linux 基本语句_16_Udp网络聊天室

    服务端代码: 客户端代码: 总体效果是客户上线状态、退出状态、发送的消息都能通过广播,将信息发送给所有在线客户端,服务端能接收并显示所有客户端发送的消息,且也具备广播能力 服务端: 服务端创建了一个链表,这个链表中的每个节点是专用于储存客户端的ip地

    2024年02月04日
    浏览(7)
  • 【运维】Linux 跨服务器复制文件文件夹

    如果是云服务 建议用内网ip scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来

    2024年02月08日
    浏览(52)
  • Linux 删除大量小文件的两种方案 | 运维进阶

    【摘要】 Linux如何删除大量小文件?本文介绍了两种方法。 【作者】赵靖宇 环境: RHEL 6.5 + Oracle 11.2.0.4 需求: 使用df -i巡检发现Inodes使用率过高,需要清理删除文件来解决。如果Inodes满,该目录将不能写,即使df -h查看还有剩余空间。 这是因为通配符*在执行时会替换为具体

    2024年02月08日
    浏览(7)
  • 【Linux】Shell脚本之流程控制语句 if判断、for循环、while循环、case循环判断 + 实战详解[⭐建议收藏!!⭐]

    【Linux】Shell脚本之流程控制语句 if判断、for循环、while循环、case循环判断 + 实战详解[⭐建议收藏!!⭐]

    👨‍🎓 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我们一起进步!😄 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏

    2024年02月13日
    浏览(16)
  • Linux 中断子系统中GIC 中断控制器基本分析

    Linux 中断子系统中GIC 中断控制器基本分析

    GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核(STM32)中的 NVIC。 GIC:Generic Interrupt Controller,通用中断控制器。 NVIC:Nested Vectored Interrupt Controller,嵌套中断向量控制器。 目前 GIC 有 4 个版本:V1~V4,V1 是最老的版本,已经被废弃了。V2~V4 目前正在大

    2024年02月07日
    浏览(11)
  • Linux入门教程||Linux文件基本属性

    Linux入门教程||Linux文件基本属性

    Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 在Linux中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和

    2024年02月08日
    浏览(10)
  • LINUX 文件基本管理

    LINUX 文件基本管理

    1、文件类型 可以通过 ls -l  或者 ll来查看文件类型 可以根据显示,查看第一个字符,就表示文件类型。 - 字符:普通文件,类似于Windows的记事本。 d 字符:目录文件,类似于Windows的文件夹。 c 字符:字符设备文件,串口端口设备,顺序读写,键盘。 b 字符:块设备文件,

    2024年02月09日
    浏览(5)
  • Linux_文件权限控制

    Linux系统的文件权限控制 一、文件权限理论认知 文件权限代表字符含义 【代表数字-4】\\\" r \\\" :英语read的缩写,具有查询权限,就是说可以阅读相关文件。 【代表数字-2】\\\" w \\\" :英语write的缩写,具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名

    2024年02月07日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包