8.文件锁、文件锁的内核结构、访问测试、权限掩码、修改文件大小

write写二进制比较麻烦,因为写的是字节流,不涉及二进制的处理

而fwrite(,"wb");就可以写入二进制

多个进程在同时写入一个文件,会出现写冲突,对不对?

不对,得是同一个文件得同一个区域

mode_t:权限类型 size_t:计数 off_t:偏移 ssize_t:

文件锁

读写冲突

1.如果两个或以上的进程同时向同一个文件的某个特定区域写入数据,那么最后写入文件的数据极有可能因为写操作的交错而产生混乱

2.如果一个进程写而其它进程同时在读一个文件的某个特定区域,那么读出的数据极有可能因为读写操作的交错而不完整

3.多个进程同时读一个文件的某个特定区域,不会有任何问题,它们只是各自文件中的数据拷贝到各自的缓冲区中,并不会改变文件的内容,相互之间也就不会冲突

4.由此可以得出结论,为了避免在读写同一个区域时发生冲突,进程之间应该遵循以下规则,如果一个进程正在写,那么其它进程既不能写也不能读,如果一个进程正在读,那么其它进程不能写但是可以读’

//写冲突演示
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>

int main(int argc,char* argv[]){
    if(argc < 2){
        fprintf(stderr,"用法:./a.out <字符串>\n");
        return -1;
    }
    
    //打开文件
    int fd = open("./shared.txt",O_WRONLY | O_CREAT | O_APPEND,0664);
    if(fd == -1){
        perror("open");
        return -1;
    }
    //写入数据
    // ./a.out  hello 
    // argv[1]记录着hello,argv[1]记录 ./a.out
    for(int i = 0;i < strlen(argv[1]);i++){
        if(write(fd,&argv[1][i],sizeof(argv[1][i])) == -1){
            perror("write");
            return -1;
        }
        sleep(1);
    }
    //关闭文件
    close(fd);
    return 0;
}

 

文件锁

1.为了避免多个进程在读写同一个文件的同一个区域时发生冲突,Unix/Linux系统引入了文件锁机制,并把文件锁分为读锁和写锁两种,它们的区别在于,对一个文件的特定区域可以加多把读锁,对一个文件的特定区域只能加一把锁

2.基于锁的操作模型是:读/写文件中的特定区域之前,先加上读/写锁,锁成功了再读/写,读/写完成以后再解锁

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值