关键字(linux 、系统调用、open、umask、文件权限) blog.sina.com.cn/s/blog_695a54a00100ni93.html

关键字(linux 、系统调用、open、umask、文件权限)

(2010-12-06 20:41:33)
标签: 

杂谈

分类: LINUX
Linux中的文件:
1) Linux中的一切都是文件,具体来说就是:我们可以像对待文件一样对待设备。最基本的5个Linux系统调用(System calls)是 open,close,read,write,ioctl,他们都可以处理文件和设备。这就是我们之所以说,文件统一了操作系统到设备的统一接口的原因。我们通常不使用上面的5个基本的接口处理目录和Socket。

2) 系统调用
我们访问和控制文件和设备使用较小数量的函数,这类函数就是系统调用(We can access and control files and devices using a small number of functions. There functions, known as system call),即系统调用就是函数。Linux中底层设备需要设备驱动(device drivers)的支持,系统调用封装了驱动,为对设备的控制提供了统一的接口,库(library)是对系统调用的进一步封装。所谓的“系统调用比库函数更加消耗资源”的说法是不准确的,假定我们合理的使用系统调用,一样是高效的。系统调用的用法:
#include <fcntl.h>
#include <sys/types.h> // Linux系统不必要,UNIX系统需要
#include <sys/stat.h>
int open(const char* path, int oflags)
int open(const char* path, int oflags, mode_t mode) : 打开一个文件或设备

#include <unistd.h>
int close(int fildes) : 关闭一个文件或设备

#include <unistd.h>
size_t write(int fildes, const void* buf, size_t nbytes) : 写入一个打开的文件或设备

#include <unistd.h>
size_t read(int fildes, void* buf, size_t nbytes) : 从一个打开的文件或设备中读取数据

#include <unistd.h>
int ioctl(int fildes, int cmd, ...): 为特定的设备提供特定的行文

现在说说文件描述符(file descriptors):所有进程(process)会关联一组文件描述符,文件描述符是一个整形数,通过这个描述符,我们可以访问打开的文件。具体来 说,文件描述符是由 open 系统调用返回的一个整形数据,标识着一个文件,它作为其他4个函数的第一个参数,这些函数通过这个参数,找到指定的文件。系统启动之后,标准输入设备(通 常是键盘),标准输出设备(通常是屏幕),标准错误设备(通常是屏幕),都会被打开,并返回3个文件描述符,它们分别是0(标准输入设备),1(标准输出 设备),2(标准错误设备)。
文件描述符从0开始,每一次调用open,都返回一个最小的可用整数,比如当前最小的文件描述符为2,下一次调用open,就会返回3。open打开同一 个文件,会访问2个不同的文件描述符。我们可以显示的调用close函数来关闭文件,程序退出后,文件也会比自动关闭,即使没有显示的调用close函 数。

以上的系统调用,在失败的时候,都返回-1,read方法读到文件结尾的时候也返回-1。

3) 访问权限
Linux中的访问权限具体来说就是目录和文件的访问权限,输入ls -l 可以看到如下信息:
drwxr-xr-x 3 killercat killercat 4096 2007-01-11 16:27 Desktop
drwx------ 8 killercat killercat 4096 2007-01-09 14:33 Documents
drwxr-xr-x 2 killercat killercat 4096 2006-11-30 19:27 Downloads
drwx------ 4 killercat killercat 4096 2006-12-16 20:20 References
drwx------ 9 killercat killercat 4096 2007-01-11 13:34 Software
drwxr-xr-x 3 killercat killercat 4096 2006-12-11 16:39 vmware
drwx------ 6 killercat killercat 4096 2007-01-11 13:34 Workspace

红色标记的表示权限信息,权限信息有2中表示形式:上面的表示方法是一种,还有一种是用3个数字表示,比如055
先看看drwxr-xr-x,前面的d表示类型(d表示这是个目录),后面的rwxr-xr-x才表示权限,r表示可读,w表示可写,x表示可执行,这9个字符,又被分成3组 rwx, r-x, r-x 它们分表表示不同的用户对本文件的访问权限,第一组表示创建文件的用户对本文件的访问权限,第二组表示创建文件的用户所在的组中的用户对文件的访问权限,第三组表示非用户所在组的用户对文件的访问权限。每组权限又可以分为3部分,比如第一组 r,w,x ,第一个位置表示是否有读权限,假如为 r 表示有读权限,为 - 表示没有此权限,第二个位置表示时候有写权限,第三个位置表示时候有执行权限。比如:
rwxr-xr-x 表示,创建文件的用户可以读写执行这个文件,同组的用户可以读和执行这个文件,其他组的用户可以读和执行这个文件。这样的表示方法比较直观,另外一种就是数字表示方法,比如055,第一个数字表示创建文件的用户的权限,第二个数字表示同组用户的权限,第三个表示其他组用户的权限。具体来说,又是这样分的:先把每个数字转化成为二进制,比如0 就是 000,5就是 101,第一个数字表示是否可读,第二个数字表示是否可以写,第三个数字表示是否可以执行。

注意上面讨论这么多,讲得都是用户的访问权限,不论是root用户,还有建立文件的用户,还是其他用户,都必须遵守上面的访问规则,假定一个文件是000,那么即使是root用户也没有办法读取,修改或者执行它。
但是,创建文件的用户和root权限的用户,可以随意更改文件的所有者和文件的权限。但是其他的用户不可以修改。

umask是linux中的一个命令,它可以设定用户权限掩码,这个值取反后,将和文件创建时指定的权限进行与操作,来决定文件最后的权限。输入 $ umask 或者 umask -S 可以得到这个掩码,使用umask命令得到的是数字的表示形式,umask -S是非数字的表示形式。一般来说umask的值默认为:0022。第一个0是特殊权限用的,后面按顺序来分别是:用户,组,其他组 的权限。也就是假定,我们建立文件的时候指定了的权限是用户可读可写可执行,组用户可以读写,不能执行权限,其他组用户也没有,也就是:730,假定umask为022,取反就是755,他们相与结果就是:
111 011 000 & 111 101 101 = 111 001 000 也就是 710
这和我们指定的730不一样,也就是我们指定用户有写权限,但是结果却没有成为我们预期所希望的。这就是umask的作用。

a) 求umask的反值。
b) 把程序中指定的权限和这个权限进行与操作,结果就是产生文件的权限。
例如:
umask = 022 ,建立一个文件时候
取反 022 = 000 010 010 取反得到 111 101 101
转化 111 101 101 & 111 011 000(假定我们程序设定的是这个权限) = 111 001 000 也就是 710 这个和上面的结果是一样的。

下面给定了一个程序,你可以使用它来做实验:
#include <fcntl.h>
#include <sys/stat.h>

int main(){
open("/home/killercat/Desktop/hi",O_CREAT,S_IRUSR|S_IWUSR|S_IXUSR
|S_IRGRP|S_IWGRP);
return 0;
}

我得到的结果是:
755,我的umask = 022

有些文献谈到文件和目录在处理上不一样,但是经过我的实践得到,他们并没有区别。我用的是Ubuntu 6.10,我运行上面程序的结果是:
-rwxr----- 1 killercat killercat 0 2007-01-11 18:06 hi
也就是权限为 710 实践的结果符合计算结果。


4) 目录结构:
描述目录的结构叫做目录流(directory stream)------DIR*
通过 opendir() 这个系统调用,可以打开一个目录,返回DIR*
通过 readdir() 这个系统调用,读取目录中的实体(directory entry)的信息,目录中实体信息被保存在一个叫做direct 的结构体中(dirent.h),direct结构体包含了d_ino和d_name成员,d_ino表示文件的inode节点,它包含文件的信息,d_name则保存文件名字。
这就是一个direct结构体的定义:
struct dirent {
ino_t d_ino;
char d_name[NAME_MAX+1];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值