zoukankan      html  css  js  c++  java
  • Apue.2e相关笔记chapter1&2

    毕业前攻克这本基础书吧,虽然不一定做这个,但是这个方向还是很不错的。全书共计21章,这里主要记录要点和自己做的习题解答。

    编译环境是debian6.0.6+xfce4,用的ide是codeblocks 12.11(刚发布,手感不错,可惜不支持fakevim)

    Chapter1是综述,各方面的常识提示。

    工作目录:使用chdir函数更改,默认为~,从passwd文件中用户的登陆项中取得。

    I/O相关:

        File descriptor,类似于win中的文件句柄

        非缓冲I/O:open, read, write, lseek和close

    程序和进程:

        进程控制:fork, exec和waitpid

        Fork创建新进程,在父进程中返回pid,在子程序中返回0;用exec函数制定新程序文件。父进程可以使用waitpid等待子进程终止。

    线程:

        线程只有独立的栈,线程ID作用于进程内部

    错误处理:

        一般函数错误都是返回负值,指针类对应NULL。一些宏常量表示错误,常以E开头(如EACCS表示权限不足)

    errno是一个可修改的整形左值,使用了本地线程存储技术,在不同线程里面指向不同的对象,注意任意函数都不会讲errno设置为0

    帮助打印出错信息的函数:strerror(int errno),返回错误码对应的错误信息;

                perror(char *msg),打印错误信息。

    用户标识:

        用户ID:getuid()

        组id:getgid()

        附加组:用户可以属于多个不同的组

    信号:

        参见ISO C里面的signal.h

    时间值:

        UTC:日历时间,使用time_t保存

        进程时间:以时钟滴答为单位,使用clock_t保存,使用sysconf取得相关信息。

        进程时间包括:wall clock time,进程运行的时间总量;用户CPU时间(执行用户指令)和系统CPU时间(执行内核程序);后两者合称为CPU时间。

        使用time函数获得具体值。

    system call和library functions:

        Linux大约有240~260个系统内核入口,一般做法是在库函数中设置与系统调用具有同样名称的一组函数。注意系统调用与库函数之间的差别,简单来说,程序通过库函数来调用系统调用,系统调用一般不可更改,函数可以根据自己的需要随便修改。系统调用一般功能唯一,尽量精简的接口数量符合设计规范。

     

    ISO C90,共计15个头文件,C99是24个,C11是29个,目前流行的版本仍然是C90,C99有少量使用。根据C++11的发展,C99的应用应该会有所发展(当然在win下不太可能)

    POSIX:可移植操作系统接口,在大部分常见的操作系统中被支持的接口(win从win8开始取消了这一子系统),最新版本是POSIX.1 2008,本书使用了POSIX.1 2001标准。标准规定了必须的和可选的头文件,所有符合标准的符号常量前缀为_POSIX

    XSI(X/Open System Interface)是由Single Unix Specification规定的一个POSIX.1的超集,其对应的符号常量是_XOPEN_UNIX,注意只有符合该接口规定的系统才能成为UNIX。这些接口依据常见的功能被分为若干选项组,包括:

    • 加密:由_XOPEN_CRYPE标记
    • 实时:由_XOPEN_REALTIME标记
    • 高级实时
    • 实时线程:由_XOPEN_REALTIME_THREADS标记
    • 高级实时线程
    • 跟踪
    • 流:由_XOPEN_STREAMS标记
    • 遗留接口:由_XOPEN_LEGACY标记

    标准的最新版也是2008版,本书使用了2004版。

    限制:各类宏(<limits.h>)和POSIX限制,如果使用POSIX限制,可以保证良好的可移植性,但是可能不能满足使用要求。去除_POSIX前缀可以得到实际的实现值,有些值可能依赖于运行环境,必须进行实时测试,可以使用三个conf函数(sysconf, pathconf和fpathconf取得)。最后还有一个类别:标准规定不确定的常数。

    这三个函数存在于头文件<unistd.h>中,后两种的区别是前者使用路径名,后者使用文件描述符作为第一个参数。共同的参数是name字段,前缀分别是_SC, _PC。返回值:long类型,如果参数不存在就返回-1(同时设置errno),如果是变量的值,返回-1就表示不确定。

    确定标准的支持情况:

        检查该符号常量是否定义,如果定义且值为-1,表明不支持该选项;大于0,支持;=0,必须使用三个函数之一进行运行时确定。

    如果只使用POSIX通用常量值,只需要定义_POSIX_C_SOURCE

    基本系统数据类型:定义在types.h中

    标准之间的冲突:

        ISO C和POSIX.1中的某些定义有差别,如clock(ISO C)返回clock_t 类型的CPU时间,除以<time.h>中定义的CLOCKS_PER_SEC,就可以得到以秒为单位的时间;而times(POSIX.1)却与sysconf对应,特别需要注意这些"用同一种数据类型保存不同值"的情况;还有一种情况是POSIX.1需要定义一些C环境没有的实现。

    总结一下:先测试当前系统支持那些标准,然后妥善取舍,注意冲突的标准。

  • 相关阅读:
    Unix/Linux系统编程-学习笔记-第一章
    vimrc配置文件
    MySQL 的 ERROR 1698 (28000): Access denied for user 'root'@'localhost'
    码云使用教程--Linux下用git命令上传和下载项目
    数电Verilog HDL设计
    Where do I belong (freeCodeCamp)
    Confirm the Ending
    数组中元素位置移动实现
    求一定范围内的素数
    回文数判断
  • 原文地址:https://www.cnblogs.com/livewithnorest/p/2858586.html
Copyright © 2011-2022 走看看