apue第一章 (2)

    技术2022-05-20  71

    我的理想是:“让我的家人过的更好”

    10ansi c

    Ansi = American national standard institute 美国国家标准协会

    Ansi c ansic语言进行的标准化。

    Ansi c 大多函数都是 使用的 void * 为指针参数,在使用的时候不用强制转换

    例如  malloc 的原型 void* malloc(size_t)

    当使用

    float * ptr;

    ptr = malloc(8*sizeof(float));时候不用强制转换。

    同理 extern ssize_t write (int __fd, __const void *__buf, size_t __n)  也不用强制转换。

    下面例子编译不会出任何warning

    //mine1-1.c

    #include<stdio.h>

    #include<stdlib.h>

     

    int main()

    {

    float * ptr;

    ptr = malloc(8 * sizeof(float));

    free(ptr);

    return 0;

    }

     

    11、原始数据类型

    extern ssize_t write (int __fd, __const void *__buf, size_t __n)  中有ssize_t  size_t 等数据类型,这是都是咋sys/type.h中定义的,带有_t的数据类型为原始数据类型,各个平台不一样,这样为了屏蔽平台的差异性。

     

    12出错处理

      <errno.h>文件中有一个变量

    #ifndef  errno

    extern int errno;

    #endif

      这个变量用于表示错误的类型

    这些错误的类型都以宏的形式定义好,而且都以E开头。例如EACCES 表示访问权限有问题,ENOENT 表示字符串指向的文件不存在,等。注意:errno 只有在出现错误的时候才改变,所有只需要在出错时候检查。errno 不会等于0.

    下面是常用的错误类型

    E2BIG   参数数组过大

    ENOEXEC   无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。

    EFAULT   参数filename所指的字符串地址超出可存取空间范围。

    ENAMETOOLONG   参数filename所指的字符串太长。

    ENOENT   参数filename字符串所指定的文件不存在。

    ENOMEM   核心内存不足

    ENOTDIR   参数filename字符串所包含的目录路径并非有效目录

    EACCES   参数filename字符串所包含的目录路径无法存取,权限不足

    ELOOP   过多的符号连接

    ETXTBUSY   欲执行的文件已被其他进程打开而且正把数据写入该文件中

    EIO   I/O   存取错误

    ENFILE   已达到系统所允许的打开文件总数。

    EMFILE   已达到系统所允许单一进程所能打开的文件总数。

    EINVAL   欲执行文件的ELF执行格式不只一个PT_INTERP节区

    EISDIR   ELF翻译器为一目录

    ELIBBAD   ELF翻译器有问题。

     

     

    下面是一个例子:

    /*出错处理*/

    #include<errno.h>

    #include<string.h>

    #include<stdio.h>

     

    int main()

    {

       /*打印 EACESS对应的字符串*/

       fprintf(stderr,"%s/n",strerror(EACCES));

       /*修改errno的值*/

       errno = ENOENT;

       /*打印当前errno 对应的字符串值*/

       perror("enoent");

    }

     

    string.h中有一个函数 char* strerror(int errno)可以返回一个错误值对相应的字符串提示。

    stdio.h中,perror(char * str)函数,在打印完字符串str后打印当前的errno对应的字符串。

     

    12、用户id,id

    linux中每一个用户都有一个用户idpasswd中出现,也有一个或者多个组id,在passwd中的组id是默认组id,一个用户也可以属于多个组。例如一个人可以是销售部的,也可以是售后部的。出了默认组id,一个用户的其他id叫扩展组id,放在/etc/group

    例如:

    white@white-desktop:/etc$ cat group

    root:x:0:

    daemon:x:1:

    bin:x:2:

    ………….

    …………..

    white:x:1000:

    sambashare:x:122:white

    winbindd_priv:x:123:

    junjun:x:1001:

     

    每一行由冒号分开,分别为:用户名,口令,组id,组内用户列表

    例如sambashare:x:122:white white属于 sambashare所在的用户组。

     

    我们可以使用 usermod –G groupname username 把一个用户加入到一个组中

        例如:我们把junjun加入到sambashare(桑巴服务器)所在组中

    root@white-desktop:/etc# usermod -G sambashare junjun

    root@white-desktop:/etc# cat group

    root:x:0:

    daemon:x:1:

    bin:x:2:

    ………………

    ………………

    white:x:1000:

    sambashare:x:122:white,junjun

    winbindd_priv:x:123:

    junjun:x:1001:

     


    最新回复(0)