Linux文件读写操作(3)

l 表示long int, 历史原因

//根据移动基准whence和移动距离offset对文件的位置指针进行重新定位,返回移动后的位置指针与文件开头的距离,失败返回-1设errno #include <unistd.h> #include <sys/types.h> off_t lseek(int fd, off_t offset, int whence); /*whence: SEEK_SET:以文件开头为基准进行偏移,0一般不能向前偏 SEEK_CUR:以当前位置指针的位置为基准进行偏移,1向前向后均可 SEEK_END:以文件的结尾为基准进行偏移,2向前向后均可向后形成”文件空洞” #include<unistd.h> #include<stdlib> int len=lseek(fd,-3,SEEK_SET); if(-1==len){ perror("lseek"),exit(-1); fcntl() //对fd进行各种操作,成功返回0,失败返回-1设errno #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... ); //...表示可变长参数 /*cmd: Adversory record locking: F_SETLK(struct flock*) //设建议锁 F_SETLKW(struct flock*) //设建议锁,如果文件上有冲突的锁,且在等待的时候捕获了一个信号,则调用被打断并在信号捕获之后立即返回一个错误,如果等待期间没有信号,则一直等待 F_GETLK(struct flock*) //尝试放锁,如果能放锁,则不会放锁,而是返回一个含有F_UNLCK而其他不变的l_type类型,如果不能放锁,那么fcntl()会将新类型的锁加在文件上,并把当前PID留在锁上 Duplicating a file descriptor: F_DUPFD (int) //找到>=arg的最小的可以使用的文件描述符,并把这个文件描述符用作fd的一个副本 F_DUPFD_CLOEXEC(int)//和F_DUPFD一样,除了会在新的文件描述符上设置close-on-exec F_GETFD (void) //读取fd的flag,忽略arg的值 F_SETFD (int) //将fd的flags设置成arg的值. F_GETFL (void) //读取fd的Access Mode和其他的file status flags; 忽略arg F_SETFL (long) //设置file status flags为arg F_GETOWN(void) //返回fd上接受SIGIO和SIGURG的PID或进程组ID F_SETOWN(int) //设置fd上接受SIGIO和SIGURG的PID或进程组ID为arg F_GETOWN_EX(struct f_owner_ex*) //返回当前文件被之前的F_SETOWN_EX操作定义的文件描述符R F_SETOWN_EX(struct f_owner_ex*) //和F_SETOWN类似,允许调用程序将fd的I/O信号处理权限直接交给一个线程,进程或进程组 F_GETSIG(void) //当文件的输入输出可用时返回一个信号 F_SETSIG(int) //当文件的输入输出可用时发送arg指定的信号 */ /*…: 可选参素,是否需要得看cmd,如果是加锁,这里应是struct flock* struct flock { short l_type; //%d Type of lock: F_RDLCK(读锁), F_WRLCK(写锁), F_UNLCK(解锁) short l_whence; //%d How to interpret l_start, 加锁的位置参考标准:SEEK_SET, SEEK_CUR, SEEK_END off_t l_start; //%ld Starting offset for lock, 加锁的起始位置 off_t l_len; //%ld Number of bytes to lock , 锁定的字节数 pid_t l_pid; // PID of process blocking our lock, (F_GETLK only)加锁的进程号,,默认给-1 }; */ 建议锁(Adversory Lock)

限制加锁,但不限制读写, 所以只对加锁成功才读写的程序有效,用来解决不同的进程 同时同一个文件同一个位置 “写”导致的冲突问题
读锁是一把共享锁(S锁):共享锁+共享锁+共享锁+共享锁+共享锁+共享锁
写锁是一把排他锁(X锁):永远孤苦伶仃

释放锁的方法(逐级提高):

将锁的类型改为:F_UNLCK, 再使用fcntl()函数重新设置

close()关闭fd时, 调用进程在该fd上加的所有锁都会自动释放

进程结束时会自动释放所有该进程加过的文件锁

Q:为什么加了写锁还能gedit或vim写???

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/990f9adedf1572e7292927ce99d85891.html