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.基于锁的操作模型是:读/写文件中的特定区域之前,先加上读/写锁,锁成功了再读/写,读/写完成以后再解锁