apue第二章

    技术2022-05-20  42

    我的目标是:“让我的家人生活得跟好”

    1Posix标准,posix = potable operating System interface for computer environment

    IEEE制订。

    2、系统的限制

       不同的平台系统都有限制,比如字长的区别,32位与64位。有点限制可以在头文件中定义,有点限制则和具体的实现有关系。比如最大文件长度,能打开的最大进程数目等。

       ANSI c的限制在limits.h 同样posix也有一些限制在相应的头文件中。

     

    例如:

    white@white-desktop:/usr/include$ cat  limits.h

     

    /* Minimum and maximum values a `signed short int' can hold.  */

    #  define SHRT_MIN     (-32768)

    #  define SHRT_MAX   32767

     

    /* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */

    #  define USHRT_MAX       65535

     

    /* Minimum and maximum values a `signed int' can hold.  */

    #  define INT_MIN (-INT_MAX - 1)

    #  define INT_MAX       2147483647

     

     

    一些限制值在编译时是可用的一些在运行时才能知道。

    我们可以使用sysconf pathconf fpathconf取得。

    Sysconf 不与文件和目录相关的运行时限制

    pathconf fpathconf与文件和目录相关的运行时限制

     

    例如下面的程序可以打印运行时的时间限制

    /* 运行时间限制 */

    #include<errno.h>

    #include<unistd.h>

    #include<stdio.h>

     

    void pr_sysconf(char *msg, int name)

    {

       long val;

       fputs(msg,stdout);

     

       errno = 0;

       if((val = sysconf(name)) < 0)

       {   

              if(errno != 0) { printf("error in pr_sysconf/n");return ;}

               fputs("not defined/n",stdout);

              return ;

       }

      

        printf("%ld/n",val);

    }

     

    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[])

    {

       pr_sysconf("CHILD_MAX = ",_SC_CHILD_MAX); //每个进程最大的子进程数

       pr_sysconf("PASS_MAX = ",_SC_PASS_MAX);   //口令最大有效字节数

       pr_sysconf("CLK_TCK = ",_SC_CLK_TCK);     //每一秒的滴答数

       pr_sysconf("ARG_MAX = ",_SC_ARG_MAX);     //exec的最大参数长度

       pr_sysconf("OPEN_MAX = ",_SC_OPEN_MAX);  //每一个进程最大打开的文件数

       pr_sysconf("STREAM_MAX = ",_SC_STREAM_MAX);  //每一时刻 一个进程打开的最大标准io流数目,如果没有定义一定于FOPEN_MAX 相同

       pr_sysconf("SAVE_IDS = ",_SC_SAVED_IDS);  //是否支持保存的设置用户id,和设置组id

       pr_sysconf("posix version = ",_SC_VERSION);  //poxis 的版本

       pr_pathconf("MAX_CANON = ", "/dev/tty",_PC_MAX_CANON);//在一终端输入的最大字节数

       pr_pathconf("MAX_INPUT = ", "/dev/tty",_PC_MAX_INPUT);//终端输入可用空间的最大字节数

       pr_pathconf("MAX_NAME = ", argv[1],_PC_NAME_MAX);//文件名的最大长度

       pr_pathconf("MAX_path = ", argv[1],_PC_PATH_MAX);//相对路径的最大字节数

       pr_pathconf("MAX_PIPE_BUF = ", argv[1],_PC_PIPE_BUF);//原子地写一个管道的最大字节数

    }

     

    1、 功能测试宏

    判断是否支持某一个标准:

    例如我们需要使用ANSI C 可使用 __STDC__

    例如

     #ifdef __STDC__

      void func(const char *str)

     #else

      Void func(char *str)

    #endif

     


    最新回复(0)