unix 环境高级编程阅读笔记1-5章节

Unix 环境高级编程

读者:注意仅仅是记录自己阅读进度,坚持阅读,没有深度
源代码:

http://www.libpix.org/apue/ 第二版

http://www.apuebook.com/code3e.html 第三版

第1章UNIX基础知识

  1. 文件和目录 2017年7月20日
  2. 系统调用和库函数

第2章 UNIX标准话及实现

  1. 最大文件描述符 sysconf

第3章 文件I/O

  1. 引言
  2. 文件描述符 0 1 2
  3. open函数
    O_TRUNC 截短为0
    文件名和路径名截短
  4. create函数
  5. close函数
    内核自动关闭
  6. lseek函数
    错误-1
    od -c file.hole
  7. read 函数
  8. write
    常见原因:磁盘已满,超过文件限制
  9. I/O 效率
    Linux ext2 块长4096
  10. 文件共享
    进程表(记录项)–文件表描述符(状态,读写、标志)–v节点(属性)
    多个进程写入一个文件
  11. 原子操作
    将多个进程写入操作合并为一个步骤。
  12. dup和dup2函数
    复制文件描述符
    另外一种方法fcntl(filedes,F_DUPFD,0)
    与fcntl不同的地方,dup2是原子操作,以及errno不同
  13. sync、fsync和fdatasync函数
    保证磁盘上的文件和缓冲区高速缓存内容的一致性。
    sync(int files) 修改过,然后冲洗缓冲区,排入写队列
  14. fcntl函数
    注意 记录锁时是一个指针
    文件描述符标志
    文件状态标志 F_SETFL O_
  15. ioctl函数
    磁盘操作
  16. /dev/fd

第4章 文件和目录

  1. 引言
  2. stat、fstat和lstat函数
  3. 文件类型
  4. 设置用户ID和设置组ID
  5. 文件访问权限
  6. 新文件和目录的所有权
  7. access函数
  8. unmask函数
  9. chmod和fchmod函数
  10. 粘住位
  11. chown、fchown和lchown函数
  12. 文件长度
    du -s file # 查看file空间
    wc -c file #统计字符
    cat file > file.copy # 填满空洞
  13. 文件截短
    int truncate(const char *pathname,off_t length) ftruncate()
    将截短为length
  14. 文件系统
    命名该目录的目录项和目录中的.项
  15. link、unlink、remove和rename项
  16. 符号链接
  17. symlink和readlink函数
  18. 文件的时间
  19. utime函数
  20. mkdir和rmdir
  21. 读目录
  22. chdir、fchdir和getcwd函数
  23. 设备特殊文件
  24. 文件访问权限
  25. 小结
    stat函数,文件属性了解
  26. 习题
    unix对目录的深度有限制吗?
    答:无,但是文件名有PATH_MAX

第5章 标准I/O库

  1. 引言
    细节:缓冲区分配、优化长度执行I/O
  2. 流和FILE对象
    int fwide(FILE *fp,int mode) mode 参数设定,宽定向(多字节)返回值为正,字节定向为负值,0表示未定向
  3. 标准输入、标准输出、标准错误
    进程预定的三个流。
  4. 缓冲
    • 全缓冲
      malloc flush
    • 行缓冲
      遇到换行符时
      行缓冲长度固定
      冲洗所有行缓冲流
    • 不带缓冲流
      stderr fputs
    • 更改缓冲类型
      void setbuf(FILE *restrict fp,char *restrict buf);
      void setvbuf(FILE *restrict fp,char *restrict buf,int mode,size_t size);
    • 冲洗流
      int fflush(FILE *fp) 是该流所有未写的数据都被传送至内核
  5. 打开流
  6. 读和写流
    • 非格式化I/O
      1. 一次一个字符
      2. 每次一行 fgets和fputs
      3. 直接I/O fread和fwrite
    • 输入函数
  7. 每次一行I/O
    • fgets gets
    • fputs puts
  8. 标准I/O的效率
  9. 二进制I/O
    #include<stdio.h>
    size_t fread(void *restrict ptr,size_t size,size_t nobj,FILE *restrict fp);
    size_t fread(void *restrict ptr,FILE *restrict fp);

  10. 定位流

    1. ftell 和fseek
    2. ftello 和 fseeko
    3. fgetpos 和 fsetpos
  11. 格式化I/O
    • 格式化输出
      printf
      fprintf
      sprintf在该数组的尾端自动加一个null字节,但该字节不包括在返回值中。
      snprintf 显示指定缓冲区大小,避免缓冲溢出。
      vprintf(,va_list arg) 可变参数
    • 格式化输出
      scanf() 同printf…
  12. 实现细节
    调用dup或者fcntl 函数将要调用int fileno(FILE *fp)
  13. 临时文件
    char *tmpname(char *ptr) #创建一个与现有文件名不相同的现有路径名
    FILE *tmpfile(void) #临时文件库,关闭该文件或程序自动删除
  14. 标准I/O的替代软件
    • 效率不高 两次复制
      内核与标准I/O之间
      标准I/O与用户程序的行缓冲之间
      mmap—映射文件
  15. 小结 I/O缓冲技术

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b
history显示历史指令记录内容,下达历史纪录中的指令主要的使用方法如果你想禁用history,可以将HISTSIZE设置为0:#exportHISTSIZE=0使用HISTIGNORE忽略历史中的特定命令下面的例子,将忽略pwd、ls、ls-ltr等命令:#exportHISTIGNORE=”pwd:ls:ls-ltr:”使用HIS
一.命令历史  1.history环境变量:    HISTSIZE:输出的命令历史条数,如history的记录数    HISTFILESIZE:~/.bash_history保存的命令历史记录数    HISTFILLE:历史记录的文件路径    HISTCONTROL:     ignorespace:忽略以空格开头的命令
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的she
BashOne-LinersExplained,PartI:Workingwithfileshttps://catonmat.net/bash-one-liners-explained-part-oneBashOne-LinersExplained,PartII:Workingwithstringshttps://catonmat.net/bash-one-liners-explained-part-twoBashOne-LinersExplained,PartII
Shell中变量的作用域:在当前Shell会话中使用,全局变量。在函数内部使用,局部变量。可以在其他Shell会话中使用,环境变量。局部变量:默认情况下函数内的变量也是全局变量#!/bin/bashfunctionfunc(){a=99}funcecho$a输出>>99为了让全局变量变成局部变量
1、多命令顺序执行;  命令1;命令2  多个命令顺序执行,命令之间没有任何逻辑联系&&  命令1&&命令2  逻辑与,当命令1正确执行,才会执行命令2||  命令1||命令2  逻辑或,当命令1执行不正确,才会执行命令2例如:ls;date;cd/home/lsx;pwd;who ddif=输入文件of=输
原博文使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"。Linux执行文件时发现这个格式,会把!后的内容提取出来拼接在脚本文件或路径之前,当作实际执行的命令。 Shebang这个符号通常在Unix系统的脚本
1、历史命令history[选项][历史命令保存文件]选项:-c:  清空历史命令-w:  把缓存中的历史命令写入历史命令保存文件 ~/.bash_historyvim/etc/profile中的Histsize可改存储历史命令数量历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史
目录1.Shell脚本规范2.Shell脚本执行3.Shell脚本变量3.1环境变量3.1.1自定义环境变量3.1.2显示与取消环境变量3.1.3环境变量初始化与对应文件的生效顺序3.2普通变量3.2.1定义本地变量3.2.2shell调用变量3.2.3grep调用变量3.2.4awk调用变量3.3
   http://www.voidcn.com/blog/wszzdanm/article/p-6145895.html命令功能:显示登录用户的信息命令格式:常用选项:举例:w显示已经登录的用户及正在进行的操作[root@localhost~]#w 11:22:01up4days,21:22, 3users, loadaverage:0.00,0.00,0.00USER