apue第三章(1)

    技术2022-05-20  38

     

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

     

    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)