手头有比较多的技术书籍,弃之可惜,放之惭愧,借助空闲时间,先草读,再demo整理。
unix环境高级编程 草读简单整理,为下一步整理细节技术点做准备(仅个人笔记)。
基本的文件操作,线程,进程,系统,进程间通信,终端控制等
1:文件和目录
demo1 :实现ls的功能,列出所有的目录文件 opendir
demo2:从标准输入读,向标准输出写。 > < read write getc putc
demo3:获取进程id gitpid() 组id 线程id /etc/group
demo4:多进程,从标准输入读入指令并执行。 专门进程执行 execlp
demo5: strerror和perror 打印错误字符串
demo6:捕获终止信号,并做相关处理
demo7:time -p指令 测量指令消耗时长
demo8:printf底层调用write系统调用?
demo9:malloc和sbrk系统调用
2:unix标准和实现
demo1:了解unix相关基础头文件。
demo2:limits中的相关限制 (ISO C和POSIX限制)
demo3:sysconf,pathconf,fpathconf函数使用 获取相关系统参数,比如 返回页面大小,打开文件描述符等。
为路径名动态分配空间,确定描述符的个数。
demo4:基本系统数据类型
3:文件IO
demo1:open,create,lseek
demo2:read,write 从标准输入复制到标准输出 缓冲区大小对性能的影响 开启同步写通过fcntl
demo3:文件共享 内核处理文件打开的结构体及存储方式。 v-node节点 多进程打开同一个文件的影响
demo4:原子操作 相关的函数 pread 和pwrite dup和dup2(原子操作)
demo5:延迟写 sync fsync fdatasync
demo6:fcntl 改变打开文件属性 整理该接口。 对文件描述符设置属性进行操作demo
demo7:预了解ioctl函数
demo8:/dev/fd/ 0 1 2 和/dev/stdin stdout stderr等相关
4:文件和目录
demo0:获取文件或者目录状态信息 stat fstat lstat fstatat 结构体stat 中存储文件类型等相关信息 其中st_mode中相关必要信息 用户用户组信息,文件访问权限 所有权等。
demo1:权限测试 access 和faccessat 测试文件的访问权限,是否有权限
demo3:umask 可以设置用户的访问权限,对文件。 类似于open和create时的参数 也是一个指令。
demo4:代码中chmod fchmod fchmodat 改权限。
demo5:chown fchown fchownat lchown 改文件的用户id和组id
demo6:空洞文件的查看 ls -l指令和du -s查看占用块大小 wc -c 查看实际字符数 设置环境变量可以改变du代表的块大小,默认512字。
demo7:文件截断 truncate ftruncate 以及打开文件时 O_TRUNC 修改文件大小?
demo8:文件系统,从分区到i节点。
demo9:链接文件 link linkat unlink unlinkat remove 以及df指令查看权限。
demo10:文件和目录的重命名 rename 和 renameat
demo11:符号链接和硬链接的区别? 符号链接用cat无效 syslink syslinkat readlink readlinkat
demo12:文件的时间 st_atim st_mtim st_ctim 以及那些操作函数会对其有影响。
修改访问时间,futimens utimensat utimes
demo13:创建删除目录 mkdir mkdirat rmdir ext2 ext3 ext4 和mount命令
demo14:读目录 opendir fdopendir readdir rewinddir closedir telldir seekdir 递归遍历目录 按类型计数demo
demo15:更改当前工作目录chdir,fchdir 以及底层原理 getcwd获取完整绝对路径
demo16:设备特殊文件,主,次设备号 major minor 的demo
demo17:文件访问权限位整理总结。
5:标准IO库 操作文件流
demo0:fwide设置流的定向,flush刷新缓冲,setbuf,setvbuf打开或者关闭缓冲机制 设置使用自己的缓冲区,fflush,
demo1:流操作,fopen,freopen,fdopen,fclose,
===》getc,fgetc,getchar ferror feof clearerr ungetc(压回流中) putc fputc putchar
demo2:fgets gets fputs puts行操作 fread fwrite二进制io操作
demo3:定位流 ftell fseek rewind ftello fseeko fgetpos fsetpos
demo4:格式化io printf fprintf dprintf sprintf snprintf vprintf vfprintf vdprintf vsprintf vsnprintf
demo5: scanf fscanf sscanf vscanf vfscanf vsscanf fileno(获取文件流的描述符)
demo6:对各个标准io流打印缓冲状态信息
demo7:临时文件 tmpnam生成文件名 tmpfile创建临时文件 mkdtemp mkstemp 创建唯一临时目录 文件
demo9:setbuf,setvbuf设置使用自己的缓冲区, fmemopen创建文件流对象,与内存缓冲区关联,像操作文件一样操作缓冲区。
===》open_memstream open_wmemstream 创建流面向字节,宽字节
6:系统数据文件和信息 /etc下文件信息 时间相关函数
demo0:了解 /etc/passwd和/etc/group 了解finger指令
demo1:getpwuid getpwnam getpwent setpwent endpwent 获取口令相关,如用户id对应的用户名和家目录
demo2:getspnam getspent setspent endspent 阴影口令 获取阴影密码文件中的信息 注意不同操作系统下阴影口令文件位置
demo3:组文件 getgrgid getgrnam getgrent setgrent endgrent
demo4:附属组 getgroups setgroups initgroups
demo5:其他数据文件及操作 /etc/services /etc/networks /etc/hosts /etc/protocols
demo6:系统标识 uname gethostname
demo7:时间和日期 time clock_gettime clock_getres clock_settime gettimeofday(已弃用但精度更高)
===》gmtime localtime mktime strftime strftime_l
7:进程环境
demo0: exit _Exit _exit 终止进程 atexit(注册终止时执行的函数) 命令行参数main函数获取
demo1:环境表 extern char **environ获取信息, 存储空间安排(正文,初始化,未初始化,堆,栈)
demo2:共享库的了解。 malloc calloc realloc 以及sbrk的关系,字节对齐。
====》相关库 libmalloc vmalloc quick-fit jemalloc TCMalloc alloca
demo3:环境变量 getenv putenv setenv unsetenv
demo4:函数setjmp和longjmp ===>goto
demo5:自动变量,寄存器变量,易失变量的测试demo
demo6:进程资源限制 getrlimit setrlimit 打印当前进程资源demo,比如当前进程的CPU时间限制
8:进程控制
demo0:id为0的进程 以及init进程 id为2页守护进程
demo1:getpid getppid getuid geteuid getgid getegid fork以及写时复制 相关内容的共享 vfork 不将父进程的地址空间完全复制到子进程
demo2:进程的exit以及异常退出等。
demo3:wait 和waitpid waitid wait3 wait4
demo4:子进程和父进程的竞态
demo5:子进程一般调用exec执行新程序 execl execv execle execve execlp execvp fexecve
demo6:setuid和setgid 用户和组id setreuid setregid seteuid setegid
demo7:解释器文件 类似于shell文件 用execl调用测试 awk指令
demo8:system函数的内部原理以及使用 实际是创建进程 调用execl 以及对信号等的完善处理 system函数demo
demo9:进程会计 记录进程命名 CPU时间 用户id 组id等必要信息 终止时的信息
===》文件内容查看信息以及通过结构打印(读进程会计文件) sa,
ac,
lastcomm,
accton等
demo10:getpwuid(getuid()) getlogin()
demo11:进程调度,优先级相关 nice getpriority setpriority demo了解其对进程调度的影响
demo12:进程时间 times 获取进程时间demo
9:进程关系
demo0:/etc/ttys telnet网络登陆
demo1:进程组 getpgrp getpgid setpgid
demo2:session会话 getsid setsid 以及控制终端 session的结构体信息
demo3:前台进程组 tcgetpgrp tcsetpgrp tcgetsid 获取会话首进程的进程组id
demo4:pr指令 作业控制,以及相关信号 前台进程,后台进程以及相关信号控制进程。
demo5:crypt 指令 ps -o指令
demo6:孤儿进程,孤儿进程组。
demo7:session的结构体信息
10:信号
demo0:信号相关头文件 signal.h 梳理相关系统信号
demo1:signal函数 处理信号,捕获信号,忽略信号?
demo2:有些函数底层,可以被信号中断。 如read等
demo3:可重入函数 以及 信号处理函数中调用不可重入函数(全局或者静态变量)。
demo4:SIGCLD信号的含义 以及demo处理
demo5:可靠信号和不可靠信号 进程对应的信号屏蔽字
demo6:kill函数和 raise函数 处理信号
demo7:alarm 超时产生信号 pause 挂起直到捕获信号
demo8:结合信号 实现sleep的功能,带时间限制的read
demo9:处理多个信号,信号集 sigemptyset sigfillset sigaddset sigdelset sigismember
demo10:进程信号屏蔽字 sigprocmask sigpending
demo11:sigaction 检查和修改信号和信号对应的执行函数
demo12:自实现signal函数 以及对应的函数返回值梳理。
demo13:sigsetjmp siglongjmp 实现系统屏蔽的信号字调用。
demo14:sigsuspend 原子操作恢复信号屏蔽字,使进程休眠。 信号屏蔽恢复成之前旧值
demo15:利用信号实现父子进程之间的同步。
demo16:函数abort的底层并实现。
demo17:函数system调用ed编辑器,并捕获信号。
demo18:利用信号实现可靠的 sleep nanosleep clock_nanosleep
demo19:信号队列的支持 sigqueue
demo20:作业控制信号 等必要信号的梳理和处理 如SIGTSTP信号的处理
demo21:信号名和编号 psignal psiginfo strsignal sig2str str2sig 打印出来demo
11:线程
demo0:进程可以看成是一个控制线程,线程标识pthread_t
demo1:pthread_equal pthread_self pthread_create 创建线程,打印线程id,比较线程id
demo2:pthread_exit pthread_join 线程终止
demo3:pthread_cancel 取消线程 pthread_cleanup_push pthread_cleanup_pop 线程清理处理程序 pthread_cancel_push pthread_detach
demo4:线程同步互斥量: pthread_mutex_init pthread_mutex_destroy pthread_mutex_lock pthread_mutex_trylock pthread_mutex_unlock
====》demo 实现一个结构 访问 多个互斥量,避免死锁demo
demo5:pthread_mutex_timedlock 不建议使用,会有诡异死锁 比如多个线程用这个函数获取锁
demo6:读写锁 pthread_rwlock_init pthread_rwlock_destroy pthread_rwlock_rdlock pthread_rwlock_wrlock pthread_rwlock_unlock
====》pthread_rwlock_tryrdlock pthread_rwlock_trywrlock 搜索频率高与操作频率时使用读写锁。
====》pthread_rwlock_timedrdlock pthread_rwlock_timedwrlock 带超时的读写锁
demo7:条件变量 无竞争方式等待特定条件发生 与互斥量一起使用
====》pthread_cond_t pthread_cond_init pthread_cond_destroy PTHREAD_COND_INITIALIZER
====》pthread_cond_wait pthread_cond_timedwait 以及内部超时时间的获取?
====》pthread_cond_signal pthread_cond_broadcast 发信号
demo8:自旋锁忙等 pthread_spin_init pthread_spin_destroy
====》pthread_spin_lock pthread_spin_trylock pthread_spin_unlock
demo9:屏障 类似于pthread_join 一组线程都在某个点上等待,所有都到达才执行。
====》pthread_barrier_init pthread_barrier_destory pthread_barrier_wait
====》多个线程使用屏蔽进行同步demo (堆算法对大数据排序时使用,使用多线程分解,然后合并)
12:线程控制
demo0:线程限制 用sysconf进行获取相关限制
demo1:线程属性 pthread_attr_init pthread_attr_destroy pthread_detach设置退出时回收资源?
demo2:pthread_attr_getdetachstate pthread_attr_setdetachstate
demo3:pthread_attr_getstack pthread_attr_setstack 设置线程的虚拟内存
demo4:pthread_attr_getstacksize pthread_attr_setstacksize pthread_attr_getguardsize pthread_attr_setguardsize 线程属性对象的大小 线程属性对象中保护区的大小
demo5:线程互斥属性 pthread_mutexattr_init pthread_mutexattr_destory pthread_mutexattr_getpshared pthread_mutexattr_setpshared 共享属性?
====》多个线程访问同一个同步对象 共享属性?
====》pthread_mutexattr_getrobust pthread_mutexattr_setrobust 健壮的互斥量属性 鲁棒性?
====》pthread_mutex_consistent 让互斥量能正常使用
====》pthread_mutexattr_gettype pthread_mutexattr_settype 得到互斥量属性
======》汇总demo 使用递归互斥量demo
demo6:读写锁属性 pthread_rwlockattr_init pthread_rwlockattr_destroy
====》 pthread_rwlockattr_getpshared pthread_rwlockattr_setpshared 进程共享属性
====》pthread_condattr_init pthread_condattr_destroy 条件变量属性 pthread_condattr_getpshared pthread_condattr_setpshared pthread_condattr_getclock pthread_condattr_setclock
====》pthread_barrierattr_init pthread_barrierattr_destroy 屏障属性 pthread_barrierattr_getpshared pthread_barrierattr_setpshared
demo7:重入,线程安全和不保证线程安全的函数
====》管理文件对象FILE的方法 ftrylockfile flockfile funlockfile getchar_unlocked getc_unlocked putchar_unlocked putc_unlocked
====》getenv的可重入和不可重入以及安全版本 demo
demo8:线程特定数据,私有数据。
====》pthread_key_create pthread_key_delete pthread_once
====》pthread_getspecific pthread_setspecific
====》取消 pthread_setcancelstate pthread_testcancel pthread_setcanceltype
demo9:线程和信号 线程信号屏蔽字
====》pthread_sigmask sigwait pthread_kill 线程中同步信号处理
demo10:pthread_atfork 和fork 处理fork后锁的问题
demo11:多线程并发操作文件 用pread pwrite
13:守护进程
demo0: ps -efj 查看相关父进程细节。 以及操作系统必要的守护进程。 inetd cron
demo1:创建一个守护进程 umask fork setsid 等创建一个孤儿进程。
demo2:守护进程的日志记录 syslogd 的相关函数 openlog syslog closelog setlogmask vsyslog
demo3:文件和记录锁 实现单实例守护进程
demo4:守护进程的一些管理 锁文件/etc/run/ 配置文件/etc/下 命令行启动,初始化脚本/etc/rc* /etc/init.d/* /etc/inittab
====》以及通过捕获信号 重新读取配置文件
====》守护进程重读配置文件的demo。 多线程 单线程
demo5:守护进程以及服务器,客户端进程模型
14:高级IO
非阻塞io,记录锁,io多路转接(select,poll),异步io,readv,writev,内存映射mmap
demo0:设置非阻塞io,从标准输入读多个字符,回显到标准输出,理解非阻塞。
demo1:文件字节范围锁(记录锁),同时操作同一个文件。 fcntl 以及struct flock(相关标志,读写锁)
demo2:文件区域加锁和解锁的demo。
demo3:模拟这种场景下的死锁。
demo4:锁的继承练习,fork子进程。
demo5:给整个文件加锁,文件末尾加锁。
demo6:建议性锁(共享锁,读锁)和强制性锁(写锁,其他进程也无法读锁吗?)对其他进程的影响。
demo7:强制性锁的练习。
demo8:思考:多人同时编辑同一文件,强制性锁在这里的意义?
demo9: telnet和telnetd服务的原理,这里如何实现一个telnet命令逻辑。(异步IO, 单独的信号触发, IO多路复用)
demo10:select和pselect的io多路复用的demo。 超时时间参数,秒和纳秒的梳理。
demo11:poll进行io多路复用接口和相关原理demo。
demo12:select和poll的可中断。 SA_RESTART 信号
demo13:异步io通过信号实现demo。
demo14:异步IO: ioctl (system) , SIGIO和SIGURG(BSD), aio模块(POSIX)。
demo15:梳理aio模块相关接口demo,翻译一个文件的异步IO实例。
demo16:散布读和聚集写 readv和 writev 读,写多个非连续缓冲区
demo17:自定义实现readn和writen 读,写指定的n个字节。
demo18:存储映射IO mmap,映射文件大小与虚拟存储页大小关系,信号sigegv和sigsegv
demo19:子进程继承父进程的映射区 mprotect修改映射权限
demo20:msync (存储映射区) munmap(解除映射)
demo21:用mmap实现复制文件,考虑大文件,以及内存的限制。 以及调用msync的时机。
demo22:直接用read和write复制文件,与用mmap复制文件的效率对比。