当前位置:  建站>其它
本页文章导读:
    ▪linux内核中的文件描述符(一)--基础知识简介      linux内核中的文件描述符(一)--基础知识简介内核版本:2.6.14 作为文件的使用者,进程理所当然的要将所使用的文件记录于自己的控制块中,也就是task_struct。另外,由于进程所对应的程序也是.........
    ▪64位系统DOSBox 下面nasm编译程序出现"Unable to open include file 'pm.inc'"          最近换了64位系统,发现其实对于操作系统的开发人员来说,这真的不是个很好的选择。但是既来之,则安之,有问题,咱就解决它!     以前在32位的cmd里面用nasm编.........
    ▪Linux 自动上传备份文件      通过sftp自动将重要数据备份至目标服务器 1.准备工作 安装lftp yum install lsfp 2.建立执行文件 bak.sh #!/bin/sh cd /usr/local/bakfile/ tar -zcvf bakfile.tar.gz bakfile HOST=192.168.0.3 USER=root PASS=centos echo "Starting.........

[1]linux内核中的文件描述符(一)--基础知识简介
    来源: 互联网  发布时间: 2013-11-02

linux内核中的文件描述符(一)--基础知识简介

内核版本:2.6.14

作为文件的使用者,进程理所当然的要将所使用的文件记录于自己的控制块中,也就是task_struct。另外,由于进程所对应的程序也是一个文件,因此进程控制块还必须记录这个文件的相关信息。由于OS要对所有进程提供服务,因此OS还要维护一个记录所有进程打开的文件的总表。

1.文件对象

当进程通过open系统调用打开一个文件时,该系统调用找到这个文件后,会把文件封装到一个file结构的实例中提供给进程,这个实例称为file对象。file结构的定义如下:

struct file {
	struct list_head	f_list;         //所有打开文件的链表
	struct dentry		*f_dentry;      //文件的dentry
	struct vfsmount         *f_vfsmnt;      //文件目录的VFS安装点指针
	struct file_operations	*f_op;          //指向文件操作函数集的指针
	atomic_t		f_count;        //记录访问本文件的进程数目的计数器
	unsigned int 		f_flags;        //访问类型
	mode_t			f_mode;         //访问模式
	loff_t			f_pos;          //文件当前的读写位置
	struct fown_struct	f_owner;
	unsigned int		f_uid, f_gid;   //文件所有者ID和用户组ID
	struct file_ra_state	f_ra;

	unsigned long		f_version;
	void			*f_security;

	/* needed for tty driver, and maybe others */
	void			*private_data;

#ifdef CONFIG_EPOLL
	/* Used by fs/eventpoll.c to link all the hooks to this file */
	struct list_head	f_ep_links;
	spinlock_t		f_ep_lock;
#endif /* #ifdef CONFIG_EPOLL */
	struct address_space	*f_mapping;
	struct rcu_head 	f_rcuhead;
};

结构中的域f_uid为文件所有者的ID,f_gid为文件所有者所在组的ID。这样就使得一个文件可能面临三种用户的访问:

  • 文件所有者;
  • 同组用户;
  • 其他用户。

内核在处理一个进程或用户访问一个文件的请求时,要根据进程的f_uid和f_gid以及访问模式来确定该进程是否具有访问这个文件的权限。对于一个用户来说,可以有读、写和执行三种文件权限,这三种权限和三种用户就共有9中组合,即文件的访问权限可以用9个bit来表示,并将其保存在文件的dentry中。

结构中的域f_pos记录了进程对文件读写位置的当前值,可以通过调用函数llseek进程移动。

结构中的f_op执向结构file_operations,该结构封装了对文件进行操作的函数,定义如下:

struct file_operations {
	struct module *owner;
	loff_t (*llseek) (struct file *, loff_t, int);
	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
	ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
	ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
	int (*readdir) (struct file *, void *, filldir_t);
	unsigned int (*poll) (struct file *, struct poll_table_struct *);
	int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
	long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
	int (*mmap) (struct file *, struct vm_area_struct *);
	int (*open) (struct inode *, struct file *);
	int (*flush) (struct file *);
	int (*release) (struct inode *, struct file *);
	int (*fsync) (struct file *, struct dentry *, int datasync);
	int (*aio_fsync) (struct kiocb *, int datasync);
	int (*fasync) (int, struct file *, int);
	int (*lock) (struct file *, int, struct file_lock *);
	ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
	ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
	ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *);
	ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
	int (*check_flags)(int);
	int (*dir_notify)(struct file *filp, unsigned long arg);
	int (*flock) (struct file *, int, struct file_lock *);
};
从上面的代码可以看到,结构中是一系列函数的指针,这里有我们比较熟悉的read、open、write和close等函数的指针。进程就是通过这些函数访问一个文件的,file_operations是linux虚拟文件系统VFS和进程之间的接口。

2.文件描述符

下面进一步介绍进程对自己所访问的file对象的管理方法。linux中使用一个数组来管理进程打开的文件的file对象,数组中的每个元素都存放一个纸箱进程所打开的文件的file对象。既然用一个数组来存放file对象,那么用数组的下标来访问文件就是一件顺理成章的方法,于是,linux就把数组元素的下标叫做该数组元素所对应的文件的文件描述符,该描述符就是系统对文件的标识,这个数组也叫文件描述符数组,如下图所示:


内核通过系统调用dup、dup2和fctl可以使数组中的多个元素指向同一个文件的file对象,也就是说,在linux中,同一个文件可以有多个文件描述符。

3.进程打开文件表

进程描述符数组中存放了一个进程所访问的所有文件,把这个文件描述符数组和这个数组在系统中的一些动态信息组合到一起,就形成了一个新的数据结构——进程打开文件表,即file_struct,其定义如下:

/*
 * Open file table structure
 */
struct files_struct {
        atomic_t count;                               //引用计数
        spinlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */
	struct fdtable *fdt;                          //管理文件描述符
	struct fdtable fdtab;                         //管理文件描述符
        fd_set close_on_exec_init;                    //位图
        fd_set open_fds_init;                         //位图
        struct file * fd_array[NR_OPEN_DEFAULT];      //文件描述符数组
};
显然,这个结构应该属于进程的私有数据,所以进程控制块task_struct用指针files指向它。

struct task_struct {
	...
/* open file information */
	struct files_struct *files;
	...
};
进程与其打开文件之间的关系如下图所示。


4.文件描述符的管理

file_struct中的fdt和fdtab用于管理文件文件描述符,一个是fdtable类型,另一个是其指针类型。fdtable的定义如下:

struct fdtable {
	unsigned int max_fds;               //可以代开的最大文件数
	int max_fdset;                      //位图的最大长度
	int next_fd;                        //下一个可用的fd
	struct file ** fd;      /* current fd array 指向files_struct的fd_array */
	fd_set *close_on_exec;
	fd_set *open_fds;                   //打开的文件标记,比如第2位为0,则打开了2号文件
	struct rcu_head rcu;
	struct files_struct *free_files;
	struct fdtable *next;
};

下图可以很直观的说明文件描述符fd的管理。


作者:ce123 发表于2013-1-8 16:31:17 原文链接
阅读:43 评论:0 查看评论

    
[2]64位系统DOSBox 下面nasm编译程序出现"Unable to open include file 'pm.inc'"
    来源: 互联网  发布时间: 2013-11-02

    最近换了64位系统,发现其实对于操作系统的开发人员来说,这真的不是个很好的选择。但是既来之,则安之,有问题,咱就解决它!

    以前在32位的cmd里面用nasm编译,NASM编译时报错:E:\Proj_OS\pmtest1.asm:6: fatal :unable to open include file 'pm.inc'

     原因:pmtest1.asm文件引用pm.inc的路径不正确

     如下,将引用路径改为pm.inc所在路径即可。
    %include "C:\OS_test\pm.inc" ;

     这次在DOSBox中模拟的时候发现,这样依旧会报错,找不到路径。纠结了半天,能试的办法都试了,还是不行。。。

     这时,突然,想到这是在DOSBox里面模拟的结果。之前通过"mount K C:\"命令将C盘挂载到了K,所以在源程序里面应该改为: 
    %include "K:\OS_test\pm.inc" ;

    一试,果然Ok...开心啊!

 

 

作者:jiusifeng 发表于2013-1-9 13:12:13 原文链接
阅读:0 评论:0 查看评论

    
[3]Linux 自动上传备份文件
    来源: 互联网  发布时间: 2013-11-02
通过sftp自动将重要数据备份至目标服务器 1.准备工作

安装lftp

yum install lsfp

2.建立执行文件 bak.sh

#!/bin/sh
cd /usr/local/bakfile/
tar -zcvf bakfile.tar.gz bakfile
HOST=192.168.0.3

USER=root
PASS=centos

echo "Starting bak File..."
lftp -u ${USER},${PASS} sftp://${HOST} <<EOF
cd /usr/bak/
lcd /usr/local/bakfile/
put bakfile.tar.gz
exit
EOF
echo "Done"

3.加入计划任务

>crontab -e

>0 1 * * 1 /usr/lcoal/bakbin/bak.sh

每星期1:00 自动执行一次

---------------------------------------

任务计划注解:

时间:

* * * * *  /bin/bin.sh &

按顺序分别表示  分  时  日 月 周

1 2 3 4 * 表示 4月3日 2:1 分执行

*/10 * * * * 表示每10分钟执行一次

0    1-5  * * *  表示 每天的 1:00  2:00 3:00 4:00 5:00  执行

在执行的文件后面 加上‘ & ’  表示后台执行

作者:dcwyiqpl 发表于2013-1-9 17:56:36 原文链接
阅读:0 评论:0 查看评论

    
最新技术文章:
▪linux内核中的信号机制--信号处理    ▪windows忘记密码    ▪常见的10种“瓶颈”
▪详解Linux内存使用信息    ▪「学习笔记——Linux」Linux软件管理(RPM,Dpkg,APT)...    ▪Shell(Bash)编程实例之获取某个文件夹下的所有...
▪Dynamics CRM 2011编程系列(49):FetchExpression(一)...    ▪Linux个人磁盘分区方案(20G)    ▪细谈MySQL配置的优化
▪交换机与路由器的区别    ▪什么叫网关的精解    ▪Linux下date命令,格式化输出,时间设置
▪「学习笔记——Linux」Linux账号管理与ACL权限...    ▪bash参考手册之四(shell内建命令)    ▪集线器、交换机、路由器、中继器及网关、网...
▪【学习笔记——Linux】Linux下正确关机方法    ▪【学习笔记——Linux】Linux磁盘和文件系统管...    ▪实验一 SCVMM安装
▪Tomcat7和mysql连接池的配置方法和测试(dbcp方...    ▪Tomcat7和mysql连接池的配置方法和测试(dbcp方...    ▪linux内核中的信号机制--信号发送
▪轻松搭建自己的Linux发行版本    ▪bash参考手册之三(基本的Shell特性)续九    ▪fedora18无线用pppoe拨号上网
▪高并发下的 Nginx 优化方案    ▪使用linux命令搜集    ▪JVM 配置参数学习与研究
▪修改CentOS的yum源为163    ▪CentOS下源码安装php+apache+mysql    ▪Redis监控方案
▪linux下压缩工具的区分-gzip,bzip2,tar    ▪基于apache搭建svn    ▪Windows下查看占用端口的程序
▪Nginx+CI 出现404错误    ▪tcpdump抓包工具的高级应用    ▪Windows socket之IOCP实例----IOCP开发驾照理论考试...
▪Web访问异常简单报警    ▪【linux环境配置】linux改成root用户的命令    ▪IIS7.0未能加载文件或程序集
▪linux下获得root权限    ▪IIS6 配置ASP.NET网站伪静态    ▪服务器更换硬盘后Oracle不能连接问题的解决
▪在源Exchange Mailbox 服务器宕机的情况下将用户...    ▪Ubuntu下WordPress更新固定链接方法总结    ▪如何在suse linux 建立共享文件夹
▪linux ntp 时间服务器及客户端安装配置    ▪Thunderbird设置邮件回复时自动签名和邮件引用...    ▪Resin Windows一键部署应用脚本BAT
▪认识Linux系统服务(鸟哥18章笔记)    ▪Vmware中的网络工作模式    ▪Cygwin + NS2 + Win XP 安装方法 网上 唯一 有效版...
▪linux内核中的文件描述符(一)--基础知识简介    ▪64位系统DOSBox 下面nasm编译程序出现"Unable to ope...    ▪Linux 自动上传备份文件
▪高并发下的 Nginx 优化方案    ▪使用linux命令搜集    ▪JVM 配置参数学习与研究 iis7站长之家
▪jdk1.7和tomcat7安装过程    ▪虚拟项目学习git/github原理与基本操作9    ▪以wifi为媒介,linux系统与android设备交互
▪find和grep命令    ▪linux编程实例1    ▪Dynamics CRM 2011编程系列(48): WCF Service 和 Web...
▪vmware 下的linux操作系统 共享windows网络    ▪一次在安装完VMware tools后,系统无法进入图形...    ▪Ubuntu 12.04重装手记
▪Linux常见的登录文件档案名称    ▪虚拟项目学习git/github原理与基本操作2    ▪安装MyEclipse6.5提示输入proxy ip和端口号问题解...
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3