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