linux环境中文件具有非常重要的意义,因为linux里的一切事物都是文件!
这就意味着在一般情况下,程序完全可以象对待文件那样对待磁盘文件、串行口、打印机以及其他设备。只要5个基本的函数就足以应付大多数问题,它们是open(打开一个文件或设备)、close(关闭一个文件或设备)、read(从一个打开的文件或设备里读数据)、write(写入一个文件或设备) 和 ioctl(把控制信息传递到设备驱动程序)。
一个程序开始运行的时候,一般会有3个文件描述符已经为它打开了,它们是:
0、标准输入
1、标注输出
2、标准错误
1、write系统调用
#include
size_t write(int filedes, const void *buf, size_t nbytes);
把缓冲区buf里的前nbytes个字节写入文件描述符filedes相关联的文件,并返回实际写入字节个数,-1表示出现了错误,对应的错误代码保存在全局变量errno里面。注:nbytes最好不要超过buf的大小,否则可能会出现不可预料的结果。
例1:在标准输出上显示一条信息
//write.c
#include
#include
int main()
{
if ((write(1,"hereis somedata\n",17))!=17)
write(2,"a write error has occurred\n",28);
exit(0); //exit()定义在stdlib.h中
}
$ gcc write.c -o write
$ ./write
hereis somedata
2、read系统调用
#include
size_t read(int filedes, const void *buf, size_t nbytes);
从文件描述符filedes相关联的文件里读人nbytes个字节的数据,放到数据区buf里。返回实际读入的字节数。
例2:截取标准输入的前128字节输出出上。
//read.c
#include
#include
int main()
{
char buffer[128];
int nread;
nread=read(0,buffer,128);
if(nread==-1)
write(2,"a read error has occurred\n",27);
if ((write(1,buffer,nread))!=nread)
write(2,"a write error has occurred\n",28);
exit(0);
}
[root@localhost c]# echo hello there| ./read
hello there
[root@localhost c]# ./read < read.c
#include
#include
int main()
{
char buffer[128];
int nread;
nread=read(0,buffer,128);
if(nread==-1)
write([root@localhost c]#
3、open系统调用
#include
#include
#indlude
int open(const char *pathname, int oflags);
int open(const char *pathname, int oflags, 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个八进制数字组成,分别对应着用户、分组和其他用户。
用户 分组 其他用户
R W X R W X R W X
R禁止读 W禁止写 X禁止执行
open调用中的mode 实际上是权限的申请,所申请的权限是否会被设置还有取决于umask 在程序运行时取的值。
打个比方,如果用户设置了自己的环境为“不准创建允许其他用户有写权限的文件,即使创建该文件的程序提出申请也不行。”但这样做并不会影响某个程序或用户在今后使用chmod命令(或者在程序中使用chmod系统调用)添加其他的权限。
4、creat系统调用
#include
#include
#indlude
int creat(const char *pathname, mode_tmode);
此函数相当于open(pathname, O_WRONLY|O_CREAT|O_TRUNC,mode);
5、close系统调用
#include
int close(int filedes);
文件描述符filedes被释放。返回0:操作成功,返回-1:操作失败。
6、ioctl系统调用
#include
int ioctl(int filedes, int cmd, ...);
ioctl调用有点像是个大麻袋。它提供了对设备行为、设备描述符、设备底层服务的配置工作等方面进行控制的操作接口。具体细节需查阅各设备的使用手册。