11、F_GETLK不是获得当前锁,而是测试一下某个锁能不能加上,并不是真正的加锁。
实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
int main(){
int fd = open("a.txt",O_RDWR | O_CREAT | O_TRUNC, 0666);
if(fd == -1){
perror("open"),exit(-1);
}
//定义锁
struct flock lock;
lock.l_type = F_WRLCK; //写锁
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 10;
lock.l_pid = -1;
//int res = fcntl(fd, F_SETLK, &lock);
int res = fcntl(fd, F_SETLKW, &lock);
if(res != -1){
int res = write(fd,"he",2);
if(res == -1){
perror("write1"),exit(-1);
}
sleep(5);
res = write(fd,"llo",3);
if(res == -1){
perror("write2"),exit(-1);
}
lock.l_type = F_UNLCK;
res = fcntl(fd, F_SETLK, &lock);
if(res == -1){
printf("释放锁失败!\n");
}
else{
printf("文件锁被释放!\n");
}
}
else{
printf("文件被锁定,无法读写!\n");
}
close(fd);
return 0;
}
成功返回0,失败返回-1。
实例:
/*
文件权限函数access演示
*/
#include <stdio.h>
#include <unistd.h>
int main(){
if(access("a.txt",R_OK) == 0){
printf("可读!\n");
}
if(access("a.txt",W_OK) == 0){
printf("可写!\n");
}
if(!access("a.txt",X_OK)){
printf("可执行!\n");
}
if(!access("a.txt",F_OK)){ //在读文件之前,检测文件是否存在
printf("文件存在!\n");
}
return 0;
}
mmap 可以映射物理内存,但也可以映射文件,默认情况下映射文件,映射物理内存需要加MAP_ANONYMOUS标识。
实例:
/*
文件函数演示
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(){
chmod("a.txt",0666);
truncate("a.txt",100);
int fd1 = open("aa",O_RDWR | O_CREAT,0666);
if(fd1 == -1){
perror("open1"),exit(-1);
}
mode_t old = umask(0022);
int fd2 = open("bb",O_RDWR | O_CREAT,0666);
if(fd2 == -1){
perror("open2"),exit(-1);
}
umask(old);
int fd3 = open("cc",O_RDWR | O_CREAT,0666);
if(fd3 == -1){
perror("open3"),exit(-1);
}
close(fd1);
close(fd2);
close(fd3);
return 0;
}
closedir() 关闭目录流(不写也可以)
实例:
/*
目录函数演示
*/
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
void printall(const char* path){ //递归函数
DIR* dir = opendir(path);
if(dir){ //目录是一个子项
struct dirent* dirent = NULL;
while(dirent = readdir(dir)){
if(strcmp(".",dirent -> d_name) == 0 || strcmp("..",dirent -> d_name) == 0){ //跳过目录“.”和“..”,避免死循环
continue;
}
if(dirent -> d_type == 4){ //目录
printf("[%s]\n",dirent -> d_name);
char buf[100] = {};
sprintf(buf,"%s/%s",path, dirent -> d_name);
printall(buf);
}
else{ //文件
printf("%s\n",dirent -> d_name);
}
}
}
else{
return;
}
}
int main(){
printall("../");
return 0;
}
3、使用递归要注意效率问题。