Chinaunix首页 | 论坛 | 博客
  • 博客访问: 762034
  • 博文数量: 790
  • 博客积分: 40560
  • 博客等级: 大将
  • 技术积分: 5065
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-28 16:29
文章分类

全部博文(790)

文章存档

2011年(1)

2008年(789)

我的朋友

分类: LINUX

2008-08-28 17:13:35

 
linux的文件系统
linux环境中文件具有非常重要的意义,因为linux里的一切事物都是文件!
这就意味着在一般情况下,程序完全可以象对待文件那样对待磁盘文件、串行口、打印机以及其他设备。只要5个基本的函数就足以应付大多数问题,它们是open(打开一个文件或设备)、close(关闭一个文件或设备)、read(从一个打开的文件或设备里读数据)、write(写入一个文件或设备)和ioctl(把控制信息传递到设备驱动程序)。

一个程序开始运行的时候,一般会有3个文件描述符已经为它打开了,它们是:
0、标准输入
1、标注输出
2、标准错误

1、write系统调用
#include
size_twrite(intfiledes,constvoid*buf,size_tnbytes);
把缓冲区buf里的前nbytes个字节写入文件描述符filedes相关联的文件,并返回实际写入字节个数,-1表示出现了错误,对应的错误代码保存在全局变量errno里面。注:nbytes最好不要超过buf的大小,否则可能会出现不可预料的结果。
例1:在标准输出上显示一条信息
//write.c
#include
#include
intmain()
{
if((write(1,"hereissomedata\n",17))!=17)
write(2,"awriteerrorhasoccurred\n",28);
exit(0);//exit()定义在stdlib.h中
}

$gccwrite.c-owrite
$./write
hereissomedata

2、read系统调用
#include
size_tread(intfiledes,constvoid*buf,size_tnbytes);
从文件描述符filedes相关联的文件里读人nbytes个字节的数据,放到数据区buf里。返回实际读入的字节数。

例2:截取标准输入的前128字节输出出上。
//read.c
#include
#include
intmain()
{
charbuffer[128];
intnread;
nread=read(0,buffer,128);
if(nread==-1)
write(2,"areaderrorhasoccurred\n",27);
if((write(1,buffer,nread))!=nread)
write(2,"awriteerrorhasoccurred\n",28);
exit(0);
}

[root@localhostc]#echohellothere|./read
hellothere
[root@localhostc]#./read#include
#include
intmain()
{
charbuffer[128];
intnread;
nread=read(0,buffer,128);
if(nread==-1)
write([root@localhostc]#

3、open系统调用
#include
#include
#indlude

intopen(constchar*pathname,intoflags);
intopen(constchar*pathname,intoflags,mode_tmode);
open函数操作成功,将返回一个文件描述符。pathname文件路径,oflags打开方式,mode_tmode权限。

oflags:
O_RDONLY以只读方式打开
O_WRONLY以只写方式打开
O_RDWR以读写方式打开
O_TRUNC把文件长度设置为零,丢弃其中现有的内容
O_CREAT按mode中给出的访问模式创建文件
O_EXCL与O_CREAT一起使用,确保调用着创建出文件来。

mode_tmode:
S_IRUSR读权限,文件属主
S_IWUSR写权限,文件属主
S_IXUSR执行权限,文件属主
S_IRGRP读权限,文件所在分组
S_IWGRP写权限,文件所在分组
S_IXGRP执行权限,文件所在分组
S_IROTH读权限,其他用户
S_IWOTH写权限,其他用户
S_IXOTH执行权限,其他用户

umask变量
umask用户掩码,由3个八进制数字组成,分别对应着用户、分组和其他用户。
用户分组其他用户
RWXRWXRWX
R禁止读W禁止写X禁止执行

open调用中的mode实际上是权限的申请,所申请的权限是否会被设置还有取决于umask在程序运行时取的值。
打个比方,如果用户设置了自己的环境为“不准创建允许其他用户有写权限的文件,即使创建该文件的程序提出申请也不行。”但这样做并不会影响某个程序或用户在今后使用chmod命令(或者在程序中使用chmod系统调用)添加其他的权限。

4、creat系统调用
#include
#include
#indlude
intcreat(constchar*pathname,mode_tmode);
此函数相当于open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);

5、close系统调用
#include
intclose(intfiledes);
文件描述符filedes被释放。返回0:操作成功,返回-1:操作失败。

6、ioctl系统调用
#include
intioctl(intfiledes,intcmd,...);
ioctl调用有点像是个大麻袋。它提供了对设备行为、设备描述符、设备底层服务的配置工作等方面进行控制的操作接口。具体细节需查阅各设备的使用手册。

阅读(198) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~