apue第三章(1)

 

我的理想是:“让我的家人生活得更好”

 

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$

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值