我的理想是:“让我的家人生活得更好”
1、一般的unix系统 提供五个系统调用就能够实现io功能了:
open read write lseek close。这些函数一般被叫做不带缓冲的io
(unbuffered io)
2、文件描述符
Unix系统中每一个打开的文件都有一个非零整数与其对应 叫做文件描述符。一般标准输入与0对应,标准输出与1对应,标准错误输出与2对应。在unix中为了便于移植,使用STDIN_FILENO STDOUT_FILENO,STDERR_FILENO (fcntl.h中)。
一个进程能打开的最大的文件描述符数目是OPEN_MAX个。可以使用sysconf(_SC_OPEN_MAX)得到这个值。
3.文件权限
unix文件或目录都有权限位,由几个标志位设定。权限分为三类:文件拥有者(user),文件拥有者所在组(group),其他用户(other)
例如一个文件的权限为 664 也即110 110 100 (rw- rw- r--),拥有者有读写权限,同组的人有读写权限,其他人只有读的权限。
4.umask
umask是在文件或者目录创建的时候用来设置文件或者目录的默认权限。一般新创建的文件unix系统不能有执行权限,文件夹可以有执行权限。
所以新创建一个文件的最大权限为666 也即rw-rw-rw- 一个目录的最大权限为777也即rwxrwxrwx.
当我们设置umsk 为 002时候我们新创建的一个文件的权限为664,文件夹的权限为775.
计算方法是
文件: 666 &~umask = 666 & 775 = 110 110 110 & 111 111 101
=110 110 100 = 664;
文件夹:777 &~umask = 777 & 775 = 111 111 111 & 111 111 101
=111 111 101 = 775;
可以使用umask命令来查询和修改umask值
例如:
white@white-desktop:~$ umask //查看umask值
0022
white@white-desktop:~$ umask 002 //修改umask值
white@white-desktop:~$ umask
0002
white@white-desktop:~$ touch testUmask //创建一个文件并查询umsk值
white@white-desktop:~$ ls -l testUmask
-rw-rw-r-- 1 white white 0 2011-03-01 11:22 testUmask
white@white-desktop:~$ mkdir testUmaskDir//创建文件夹并查询umask值
white@white-desktop:~$ ls -ld testUmaskDir/
drwxrwxr-x 2 white white 4096 2011-03-01 11:24 testUmaskDir/
white@white-desktop:~$
5、文件名截断:
当文件名超过 MAX_NAME的时候,有点系统会将文件名截断,有点系统返回一个ENAMETOLONG 错误。由_POSIX_NO_TRUNC来决定是否截断。
例如下面答案程序
white@white-desktop:/home/junjun/apue/chapter3$ cat testTrunc.c
/* 测试是否截断 */
#include<errno.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
void pr_pathconf(char *msg,char *path, int name)
{
long val;
fputs(msg,stdout);
errno = 0;
if((val = pathconf(path,name)) < 0)
{
if(errno != 0) { printf("error in pr_sysconf/n");return ;}
fputs("not defined/n",stdout);
return ;
}
printf("%ld/n",val);
}
int main(int argc, char *argv[])
{
char * name = "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.txt";
/*当文件名太长了,是否会截断文件名,如果_POSIX_NO_TRUNC 为1 标示不会截断*/
#ifdef _POSIX_NO_TRUNC
printf("_POSIX_NO_TRUNC = %d/n",_POSIX_NO_TRUNC);
#else
printf("not defined/n");
#endif
pr_pathconf("MAX_NAME = ", argv[1],_PC_NAME_MAX);//文件名的最大长度
if(open(name,O_RDONLY|O_CREAT)< 0)
{printf("open error/n");perror("open");}
else printf("open ok/n");
}
执行情况:当文件名太长了,不会截断,而是报错
white@white-desktop:/home/junjun/apue/chapter3$ ./testTrunc.out testTrunc.c
_POSIX_NO_TRUNC = 1
MAX_NAME = 255
open error
open: File name too long
white@white-desktop:/home/junjun/apue/chapter3$