title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips

linux/unix编程手册-11(系统限制和选项)

limit.h定义了最小值

$ getconf OPEN_MAX
7168
$ getconf ARG_MAX
262144
复制代码

略略略

linux/unix编程手册-12(系统和进程信息)

/proc/$PID

/pid/self 访问当前进程 /pid/$PID
/pid/$PID/tasks/$TID 线程
复制代码
#include <sys/utsname.h>
int uname(struct utsname *utsbuf)
复制代码

linux/unix编程手册-13(文件I/O缓冲)

文件系统的块(补充)

read, write仅在用户缓冲区和内核缓冲区高速缓存(kernel buffer cache)之间复制数据,文件和内核缓冲区的数据复制由内核控制

用户缓冲区和内核缓冲区高速缓存

一些控制缓存的函数

#include<stdio.h>int setvbuf(FILE *stream, char *buf, int mode. size_t size);void setbuf(FILE *stream, char *buf);void setbuffer(FILE *stream, char *buf, size_t size);int fflush(FILE *stream);//setbuf 忽略return 等价于:
setbuf(fp, buf);
setvbuf(fp, buf, (buf != NULL)? _IOFBF:_IONBF, BUFSIZE);
setbuffer(fp, buf, size);
setvbuffer(fp, buf, (buf != NULL)? _IOFBF:_IONBF, size);复制代码

setvbuf

  • buf不为NULL, buf 和 size决定stream的缓冲区,在堆中分配空间
  • buf为NULL, stdio库会为stream自动分配一个缓冲区,不一定使用size值
  • mode
    • _IONBF不缓冲,立刻调用write(),open(),stderr默认这种类型
    • _IOLBF行缓冲,对于输出流,换行符和缓冲区满输出,对于输入流,每次读取一行,终端设备默认
    • _IOFBF全缓冲,指代磁盘的流默认此

fflush

  • 将输出流的数据刷新到内核缓冲区,无stream会刷新所有stdio缓冲区
  • 输入流时,将丢弃缓冲区内数据
  • 关闭流时会刷新

多数c库实现,stdin和stdout指向同一终端,调用stdin时会隐含一次调用fflush(stdout)

内核缓冲到磁盘

  • 同步I/O数据完整性
  • 同步I/O文件完整性(相较于前者,一些不影响文件读取的元数据也需要更新到磁盘上(如文件的时间戳))

stdio函数库I/O详图

#define _XOPEN_SOURCE 600
#include<fcntl.h>int posix_fadvise(int fd, off_t offset, off_t len, int advise);
//通知内核优化缓冲区使用的接口,略、、、
复制代码
#include<stdio.h>int fileno(FILE *stream);FILE *fdopen(int fd, const char *mode);//文件流和描述符转换
复制代码

linux/unix编程手册-14(文件系统)

设备文件

  • 实际设备,虚拟设备
  • 字符型设备,块设备
    • 字符型设备基于每个字符处理:键盘,终端
    • 块设备每次处理一块设备,通常为512的倍数:磁盘
  • /dev

磁盘和分区

磁盘分区可容纳任何类型的信息,但通常只包含之一

  • 文件系统
  • 数据区域
  • 交换区域:内核内存管理

文件系统

当文件存在大量空白时,文件系统只需将i节点和间接指针块中的相应指针打上0,无需分配额外资源

VFS:各种文件系统的抽象层

日志文件系统:避免系统崩溃后遍历文件系统的一致性检查(ext3, ext2)

文件的挂载和卸载

$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=3995724k,nr_inodes=998931,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
....
##内容在 /proc/mounts   里面,每个进程都有独立的/proc/$PID/mounts
$ ll /proc/mounts
lrwxrwxrwx 1 root root 11 6月   2 21:25 /proc/mounts -> self/mounts
复制代码

绑定挂载和硬链

$ mkdir d1
$ touch d1/x
$ mkdir d2
$ mount --bind d1 d2
$ ls d2
x
$ touch d2/y
$ ls d1
x   y
复制代码

tmpfs:虚拟内存文件系统

linux/unix编程手册-15(文件系统)

获取文件信息

#include<sys/stat.h>int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);//lstat当访问的是链接时,返回的信息针对符号链接本身
复制代码

文件权限

st_mode
复制代码

权限检查算法

  • linux内核会使用当前进程的文件系统用户ID和组ID(可以认为是有效ID)进行有效检查
  • 检查的顺序的影响(一般:特权->用户id->组id)
  • 文件的三种权限类型至少之一有可执行权限或读权限时,特权进程才有相应的执行和读(不同unix可能不同)
  • U(set-user-id)位, G(set-group-id)位, T(sticky)位
    • T位表明非特权进程,具有对目录的写权限并且为文件或目录的属主时,才能对目录下文件进行删除(/tmp文件可)
    $chmod +t tfile
    $ls -l tfile
    -rw-r--r-T
    复制代码
  • 新文件的属主:
    • 用户ID集成进程的有效用户ID
    • 组ID取自有效用户组ID或者父目录的组ID
      • mount时有-o grpid时会设置目录的G位,新文件总会集成父目录同时设定G位
      • mount默认是-o nogrpid

umask

#include <sys/stat.h>
mode_t umask(mode_t mask);
//Always successfully returns the previous process umask
复制代码
  • /etc/profile 默认值一般是0022(0002?)
  • 文件创建时通常没有x权限,目录有
$lsattr
$chattr
复制代码

linux/unix系统编程手册11-15相关推荐

  1. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  2. Linux/UNIX系统编程手册gg

    Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...

  3. Linux/Unix系统编程 五:进程

    进程是一个可执行程序的实例. 一.linux系统进程管理 1.进程管理的作用 判断机器健康状态 查看系统中所有进程 杀手进程 2.查看系统进程 1.ps -aux BSD操作系统格式: TTY说明: ...

  4. Linux系统编程手册-源码的使用

    Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...

  5. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

  6. ①Linux简明系统编程(嵌入式公众号的课)---总课时12h

    10.09 注意:这个是Linux高级编程的简明教程,是Linux应用程序的开发,而不是底层程序的开发. 内容是关于操作系统和网络编程的吗? Linux简明系统编程 〇.课程思维导图 〇.会用到的头文 ...

  7. LINUX C系统编程与PYTHON中的时间模块对比

    今天看python时间模块time的时候发现和LINUX系统编程中的时间调用函数基本一样,以前刚好没有好好学习LINUX C编程的时间模块就对比进行了学习. 本文只是给出函数接口和使用方式,详细了解请 ...

  8. 【Linux】系统编程之文件(标准I/O库)

    目录 一.文件I/O与标准I/O的区别(open与fopen) 1.来源 2.移植性 3.适用范围 4.文件IO层次 5.缓冲 二.函数fopen.fwrite.fread.fseek.fclose ...

  9. UNIX系统编程(1)

    注:本文来自"网易"博主,仅阅读,学习 第一章:什么是系统编程  UNIX系统编程,简单的说就是"C语言+系统调用(system call)",学会了C语言再知 ...

最新文章

  1. UART接口与COM口的区别
  2. Webview页面的控件元素定位
  3. 给技术人上的管理课:平衡和集中
  4. qlikview连接mysql_QlikView通过ODBC连接IBMDB2
  5. VTK:图表之VisualizeGraph
  6. mysql aop_aop: 使用spring aop实现业务层mysql 读写分离
  7. vim简单操作---学习随笔
  8. 不得不会的10点Java基础知识
  9. linux里netstat与ps,理解proc目录与linux进程、ps命令、netstat命令的关系
  10. [MySQL FAQ]系列 -- Linux命令行下快速监控mysql
  11. android 权限管理详解,EasyPermissions源码浅析
  12. linux 设备驱动之8250串口驱动分析
  13. jsp乔丹AJ购物网站网上鞋店黑色ssh
  14. cad批量打印_「CAD」打印输出设置详解——批量打印
  15. 2020美亚杯个人赛头脑风暴
  16. E - Antinomy与红玉海
  17. 主线程启动多个子线程,子线程彼此之间并发执行,互不影响
  18. 极坐标系及其他常用坐标系的表示方法
  19. 在js中Date对象用getDay方法get到的是个啥玩意儿?
  20. Windows压缩工具 “ Bandizip 与 7-zip ”

热门文章

  1. pip install python-docx报错_python各种模块的安装
  2. linux中vi写java,Linux编辑器vi使用方法详细介绍
  3. 计算机四级操作系统原理知识汇总,2015年全国计算机四级《操作系统原理》考试内容...
  4. python怎么做界面自动化_mac+python3+selenium做pc的界面自动化测试
  5. HDLBits 系列(31)Serial Receiver and Datapath
  6. 【 MATLAB 】unmkpp 函数介绍
  7. JavaScript多态
  8. 华为云数据库自研黑科技,助推企业成本再降 50%
  9. Google推出开源空间音频编码引擎Songbird
  10. 思科发力虚拟化和云服务 推出多款新品