UC编程5-fcntl函数获取文件状态和加锁解锁/dup函数和文件映射

//myuc.h

#include<stdio.h>//io流
#include<stdlib.h>//标准库
#include<unistd.h>//uc标准头文件
#include<fcntl.h>//文件控制
#include<string.h>//c字符串
#include<sys/types.h>
#include<sys/mman.h>//内存映射
#include<sys/stat.h>//文件状态信息
#include<sys/wait.h>//进程等等
#include<dirent.h>//目录操作
#include<signal.h>//信号
#include<sys/time.h>//时间,计时器
#include<sys/ipc.h>//ipc进程间通信
#include<sys/shm.h>//共享内存段
#include<sys/msg.h>//消息队列

//dup5.c

#include "myuc.h"
int main()
{
	int fd=open("dup5",O_RDWR|O_CREAT|O_TRUNC,0777);
	printf("fd=%d\n",fd);
	int fd2=dup(fd);
	printf("fd2=%d\n",fd2);
	int fd3=dup2(fd,100);
	printf("fd3=%d\n",fd3);
	write(fd,"1",1);
	write(fd2,"2",1);
	close(fd);
	close(fd2);
	close(fd3);
	return 0;
}

//fcntl5.c

#include "myuc.h"
int main()
{
	int fd=open("txt",O_RDWR|O_CREAT|O_APPEND,0777);
	if(fd==-1) perror("open"),exit(-1);
	int fd2=fcntl(fd,F_DUPFD,5);//复制文件描述符
	int fd3=fcntl(fd,F_DUPFD,5);//复制,返回可用的>=参数的最小值
	printf("fd=%d,fd2=%d,fd3=%d\n",fd,fd2,fd3);
	int flags=fcntl(fd,F_GETFL);//获取权限,不包含创建标记

	printf("flags:%d\n",flags);

	printf("%d  %d\n",flags&O_RDWR,O_RDWR);
	if((flags&O_RDONLY)==O_RDWR) printf("读写权限\n");
	if((flags&O_RDONLY)==O_RDONLY) printf("读权限\n");
	if((flags&O_WRONLY)==O_WRONLY) printf("写权限\n");
	if((flags&O_APPEND)==O_APPEND) printf("追加\n");
	fcntl(fd,F_SETFL,O_WRONLY);//修改权限,只修改了O_APPEND权限
	printf("^^^^^^^^^^^^^^^^^^\n");
	flags=fcntl(fd,F_GETFL);//
	if((flags&O_APPEND)==O_APPEND) printf("追加\n");
	else printf("无追加属性!\n");

	close(fd);
	close(fd2);
	close(fd3);
	return 0;
}

//lock5.c

#include "myuc.h"
int main()
{
	int fd=open("lock5",O_RDWR|O_CREAT);
	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=lseek(fd,0,SEEK_END);
	lock.l_pid=-1;
	int res=fcntl(fd,F_SETLK,&lock);//加锁,返回-1代表失败
	if(res==-1) printf("加锁失败\n");
	else{
	   	printf("加锁成功\n");
		write(fd,"12345",5);
		lock.l_type=F_UNLCK;
		lock.l_pid=getpid();
		printf("pid=%d\n",lock.l_pid);
	    res=fcntl(fd,F_SETLK,&lock);//解锁,返回-1代表失败

	}
	sleep(50);
	close(fd);
	return 0;
}

//mmap5.c

/*
 mmap映射到文件,写文件和操作内存一样。
 */
#include "myuc.h"
typedef struct Emp{
	int id;
	char name[20];
	double sal;
}emp;
int main()
{
	int fd=open("mmap5.dat",
					O_RDWR|O_CREAT|O_TRUNC,0777);
	if(fd==-1) perror("open"),exit(-1);
	ftruncate(fd,sizeof(emp)*3);//大小不够,就会出错
	emp * pe=mmap(NULL,sizeof(emp)*3,
					PROT_READ|PROT_WRITE,//小于等于fd的权限
					MAP_SHARED,//私有方式映射MAP_PRIVATE,不写入文件
					fd,0);
	if(pe==MAP_FAILED) perror("mmap"),exit(-1);
	pe[0].id=1;
	strcpy(pe[0].name,"zf");
	pe[0].sal=1500;
	pe[1].id=2;
	strcpy(pe[1].name,"gy");
	pe[1].sal=1200;
	pe[2].id=3;
	strcpy(pe[2].name,"lb");
	pe[2].sal=120000;
	int i;
	for(i=0;i<3;i++)
	{
		printf("%d,%s,%lf\n",pe[i].id,pe[i].name,pe[i].sal);
	}
	munmap(pe,sizeof(emp)*3);
	close(fd);
}

//stat5.c

/*
 获取文件状态和判断权限
 */
#include "myuc.h"
#include<time.h>
void test1()
{
	printf("^^^^test1^^^^\n");
	struct stat s={};
	int res=stat("a.txt",&s);
	if(res==-1) perror("stat"),exit(-1);

	printf("inode=%d\n",(int)s.st_ino);
	printf("size=%d\n",(int)s.st_size);
	printf("link=%d\n",s.st_nlink);
	printf("mdate=%s\n",ctime(&s.st_mtime));
	printf("mode=%o\n",s.st_mode);
	printf("access=%o\n",s.st_mode& 0777);

	if(S_ISREG(s.st_mode))
			printf("普通文件\n");
	else if(S_ISDIR(s.st_mode))
			printf("是目录\n");
	if(access("a.txt",R_OK)==0) printf("可读\n");
	if(access("a.txt",W_OK)==0) printf("可写\n");
	if(access("a.txt",X_OK)==0) printf("可执行\n");
	if(access("a.txt",F_OK)==0) printf("存在\n");

}
void test2()
{
	printf("^^^^test2^^^^\n\n");
	chmod("a.txt",0740);
	truncate("a.txt",100);
	struct stat s={};
	int res=stat("a.txt",&s);
	if(res==-1) perror("stat"),exit(-1);
	printf("access=%o\n",s.st_mode& 0777);
	printf("size=%d\n",(int)s.st_size);
	mode_t old=umask(0000);//修改屏蔽字,并保存旧的屏蔽字
	int fd=open("a1.txt",O_RDWR|O_CREAT,0777);//使用新的屏蔽字创建文件
	printf("旧屏蔽字:%o\n",old);
	umask(old);//恢复系统默认屏蔽字
	close(fd);
}
int main()
{
	test1();
	test2();
	return 0;
}
时间: 2024-12-24 21:58:01

UC编程5-fcntl函数获取文件状态和加锁解锁/dup函数和文件映射的相关文章

简要对比C语言中的dup()函数和dup2()函数_C 语言

C语言dup()函数:复制文件描述词头文件: #include <unistd.h> 定义函数: int dup (int oldfd); 函数说明:dup()用来复制参数oldfd 所指的文件描述词, 并将它返回. 此新的文件描述词和参数oldfd 指的是同一个文件, 共享所有的锁定.读写位置和各项权限或旗标. 例如, 当利用lseek()对某个文件描述词作用时, 另一个文件描述词的读写位置也会随着改变. 不过, 文件描述词之间并不共享close-on-exec 旗标. 返回值:当复制成功时

UNIX网络编程:fcntl函数

fcntl函数提供了与网络编程相关的如下特性: 非阻塞式I/O.  通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型. 信号驱动式I/O. 通过使用F_SETFL命令设置O_ASYNC文件状态标志,我们可以把一个套接字设置成O_ASYNC,一旦其状态发生变化,内核就产生一个SIGIO信号. F_SETOWN命令允许我们指定用于接收SIGIO和SIGURG信号的套接字属主(进程ID或进程组ID).其中SIGIO信号是套接字被设置为信号驱动式I/O型

UC编程8-信号发送函数kill/raise/setitimer/alarm和信号集函数segprocmask

//myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文件 #include<fcntl.h>//文件控制 #include<string.h>//c字符串 #include<sys/types.h> #include<sys/mman.h>//内存映射 #include<sys/stat.h>//文件状

UC编程7-进程创建函数fork/vfork 和 execl/信号signal的使用1

//myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文件 #include<fcntl.h>//文件控制 #include<string.h>//c字符串 #include<sys/types.h> #include<sys/mman.h>//内存映射 #include<sys/stat.h>//文件状

C语言用fstat函数获取文件的大小

之前获取文件大小总是用死办法,open一个文件,然后lseek,read这样去获取文件的大小,这样的效率实在是低,还有可能粗心大意还会出错. 一次偶然在Android的源代码中看到获取文件大小的函数,在以下范例中.用fstat这个函数可以避免这些问题. 参考百度:http://baike.baidu.com/link?url=wh6msZkLUlTCx8P6YzujB3YoHaLLVaO68sQIIPR6ICj1yXYJxHfTDvxFwzjJ4YlpZZ8IDsKhKyf9EaCHo4ARHa

UC编程6-目录操作和创建子进程fork()函数1

//myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文件 #include<fcntl.h>//文件控制 #include<string.h>//c字符串 #include<sys/types.h> #include<sys/mman.h>//内存映射 #include<sys/stat.h>//文件状

C语言中获取文件状态的相关函数小结_C 语言

C语言stat()函数:获取文件状态头文件: #include <sys/stat.h> #include <unistd.h> 定义函数: int stat(const char * file_name, struct stat *buf); 函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中. 下面是struct stat 内各参数的说明: struct stat { dev_t st_dev; //device 文件的设备编号

应用PHP文件函数获取文件信息实例教程

上一篇PHP目录函数教程中主要介绍了目录(文件夹)读取,遍历的方法,但最基本的文件管理系统同时涉及到文件信息.文件大小读取以便检查磁盘使用情况,也需要获取文件修改或访问时间,删除或移动整理文件的功能,这些都需要通过PHP文件函数同文件系统交互. 基本PHP文件函数介绍 PHP文件函数dirname()和basename()的区别 dirname()获得文件目录路径的目录部分,而basename()获得不带目录的文件名 如何通过PHP文件函数获得文件基本信息? 之前介绍了PHP目录读取实例,我们只

install.log-cp: 无法获取&amp;amp;quot;/boot/grub/*&amp;amp;quot; 的文件状态(stat): 没有那个文件或目录”

问题描述 cp: 无法获取"/boot/grub/*" 的文件状态(stat): 没有那个文件或目录" 安装centos6.4时,我先用桌面安装,系统安装完成后,/root/install.log中显示正常. 但是当我选择用基本服务安装方式安装,安装完成后,/root/install.log中有一行显示异常. cp:无法获取"/boot/grub/*" 的文件状态(stat): 没有那个文件或目录" (说明:/boot/grub这个目录是存在的)