arthasdragon / learn Goto Github PK
View Code? Open in Web Editor NEWlearn node from packages
learn node from packages
dedupe模块(返回去重后的数组)-----依赖sigmund模块(取对象的向下遍历特定层数的字符串表示当做该obj的hash)
array-range (返回start-end的数字组成的数组,但是未考虑start和end都是字符串的情况)
小的非负整数,内核用来标识一个特定进程正在>访问的文件
一般默认指向终端
> out.file
< enter.file
上述命令输出重定向到 out.file
输入重定向到 enter.file
函数 open、read、write、lseek 和 close 提供了不带缓冲的 I/O,均使用文件描述符
无需担心如何选取最佳的缓冲区大小
内核使用 exec 函数,将程序读入内存,并执行程序
程序的执行实例被称为进程(process)
唯一数字标识符,进程 ID 总是一个非负整数
3 个用于进程控制的主要函数:fork、exec、waitpid
文件<errno.h>中定义了 errno 以及可以赋予它的各种常量
对于 errno 应当注意:
- 如果没有出错,其值不会被例程清除
- 任何函数不会将 errno 值设置为 0
出错恢复
可以将<errno.h>中定义的各种出错分成致命性和非致命性两类
- 用户 ID
- 组 ID
- 附属组 ID
/etc/group
进程有以下 3 种处理信号的方式
- 忽略信号
- 按系统默认方式处理
- 提供一个函数,信号发生时调用该函数,捕捉该信号
终端键盘上中断键(Delete/Ctrl+C)和退出键(常为 Ctrl+\)可产生信号,中断当前进程
kill 函数可向另一个进程发送信号
- 日历时间(time_t)
- 进程时间(clock_t)
- 时钟时间
- 用户 CPU 时间
- 系统 CPU 时间
C 程序设计语言的标准,现由 WG14 工作组维护和开发
下图中头文件在 4 种 UNIX 实现(FreeBSD8.0、Linux3.2.0、Mac OS X10.6.8 和 Solaris10)中都支持
图示四种 UNIX 系统包含的必需、可选头文件
必需头文件
可选头文件
POSIX.1 标准的一个超集
SVR4、4.4BSD、FreeBSD、Linux、Mac OS X、Solaris 等
前面提到的各个标准定义了任一实际系统的子集
问题:某些限制在一个给定的实现中可能是固定的(头文件中定义),而在另一个实现中则可能是变动的(需要一个运行时函数调用)
解决方案:
提供以下三种限制
- 编译时限制(头文件)
- 与文件或目录无关的运行时限制(sysconf 函数)
- 与文件或目录有关的运行时限制(pathconf 和 fpathconf 函数)
ISO C 顶一顶所有编译时限制都在头文件<limits.h>中
三种特别强调常量:
- FOPEN_MAX (<stdio.h>中,保证可同时打开的标准 I/O 流的最小个数,POSIX.1 中的 STREAM_MAX 应与其具有相同的值)
- TMP_MAX(<stdio.h>中,由 tmpnam 函数产生的唯一文件名的最大个数)
- FILENAME_MAX(应避免使用因为 POSIX.1 提供了更好的 NAME_MAX 和 PATH_MAX)
路径名、最大打开文件数等(需运行时判断手动设置或其他处理方式)
POSIX.1 三种处理选项的方法
- 编译时选项定义在<unistd.h>中
- 与文件或目录无关的运行时选项用 sysconf 函数来判断
- 与文件或目录有关的运行时选项通过调用 pathconf 或 fpathconf 函数来判断
对于每一个选项,有以下三种可能的平台支持状态
- 如果符号常量没有定义或者定义值为-1,name 该平台在编译时并不支持相应选项
- 如果符号常量的定义值大于 0,那么该平台支持相应选项
- 如果符号常量的定义值为 0,则必须调用 sysconf、pathconf 或 fpathconf 来判断相应选项是否受到支持
_POSIX_C_SOURCE、_XOPEN_SOURCE 等
_POSIX_C_SOURCE(编译一个程序时,希望它只与 POSIX 的定义相关,不与任何实现定义的常量冲突则定义该常量)
以下命令定义该宏
cc -D_POSIX_C_SOURCE=200809L file.c
头文件<sys/types.h>和其他头文件中定义了某些与实现有关的数据类型,它们被称为基本系统数据类型,都是用 C 的 typedef 来定义的,绝大多数以_t 结尾
主要关注 ISO C 标准和 POSIX.1 之间的差别,如果出现冲突,POSIX.1 服从 ISO C 标准,但是 clock_t 和某些函数仍然有细微差别
对于内核而言,所有打开的文件都通过文件描述符引用(一个非负整数)。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,使用 open 或 create 返回的文件描述符标识该文件,将其作为参数传送给 read 或 write。
调用 open 或 openat 函数打开或创建一个文件
#include <fcntl.h>
int open(const char *path, int aflag, ...);
int openat(int fd, const char *path, int aflag, ...);
由 open 和 openat 函数返回的文件描述符一定是最小的未用描述符数值
fd 参数把 open 和 openat 函数区分开
创建新文件
#include <fcntl.h>
int creat(const char *path, mode_t mode)
返回值:成功则返回只写打开的文件描述符,出错返回-1
关闭一个打开的文件
#include <unistd.h>
int close (int fd)
返回值:成功 0,出错-1
关闭一个文件时还会释放该进程加在该文件上的所有记录锁
每个打开文件都有一个与其相关联的“当前文件偏移量”
调用 lseek 可为一个打开文件设置偏移量
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence)
返回值:成功 -> 新的文件偏移量,出错 -> -1
对参数 offset 的解释与参数 whence 的值有关
从打开文件中读数据
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes)
返回值:读到的字节数,若已到文件尾,返回 0,出错,-1
实际读到的字节数少于要求读的字节数的情况:
向打开文件写数据
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);
返回值:成功 -> 已写的字节数,出错 -> -1
UNIX 系统支持在不同进程间共享打开文件
一般而言,原子操作指的是由多步组成的一个操作
均为原子操作
复制一个描述符的另一种方法是使用 fcntl 函数
通常,当内核需要重用缓冲区来存放其他磁盘块数据时,会把所有延迟写数据块写入磁盘。为保证磁盘上实际文件系统与缓冲区中内容的一致性,UNIX 系统提供了 sync、fsync 和 fdatasync 三个函数
sync 只将所有修改过的块缓冲区排入写队列就返回
update 系统守护进程周期性调用 sync 函数。保证定期冲洗内核的块缓冲区
fsync 函数只对由文件描述符 fd 指定的一个文件起作用,且等待写磁盘操作结束才返回
fdatasync 函数类似于 fsync,但它只影响文件的数据部分
fcntl 函数可以改变已经打开文件的属性
#include <fcntl.h>
int fcntl(int fd, int cmd, .../* int arg */)
返回值:成功 -> 依赖 cmd,出错 -> -1
以下 5 种功能:
ioctl 函数一直是 I/O 操作的杂物箱
较新的系统都提供名为/dev/fd 的目录,其目录项是名为 0、1、2 等的文件。打开文件/dev/fd/n 等效于复制描述符 n(如果描述符 n 是打开的)
与一个进程相关联的 ID 有 6 个或更多
每个文件有一个所有者和组所有者,所有者由 stat 结构中的 st_uid 指定,组所有者则由 st_gid 指定
进程每次打开、创建或删除一个文件时,内核就进行文件访问权限测试,具体如下:
新文件的用户 ID 设置为进程的有效用户 ID,组 ID ,POSIX.1 允许实现选择下列之一
进程的有效组 ID
文件所在目录的组 ID
access 和 faccessat 按实际用户 ID 和实际组 ID 进行访问权限测试(步骤同 4.5)
#include <unistd.h>
int access(const char *pathname, int mode);
int faccessat(int fd, const char *pathname, int mode, int flag);
返回值:成功 -> 0,出错 -> -1
umask 函数为进程设置文件模式创建屏蔽字,并返回之前的值(少数几个没有出错返回函数中的一个)
八进制数(屏蔽的权限)/符号形式(许可的权限)
更改现有文件的访问权限
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);
int fchmodat(int fd, const char *pathname, mode_t mode, int flag);
返回值:成功 -> 0,出错 -> -1
chmod 在指定的文件上进行操作,fchmod 对已打开的文件进行操作
进程的有效用户 ID 必须等于文件的所有者 ID,或者进程具有超级用户权限
用于更改文件的用户 ID 和组 ID。如果两个参数 owner 或 group 中的任意一个是-1,则对应的 ID 不变
stat 结构成员 st_size 表示以字节为单位的文件的长度
本节讨论 UFS 文件系统
创建一个指向现有文件的链接的方法是使用 link 函数或 linkat 函数
文件或目录可以用 rename 或 renameat 重命名
符号链接是对一个文件的间接指针,而上节硬链接直接指向文件 i 节点,符号链接用来避开硬链接的一些限制。
用 symlink 或 symlinkat 创建
readlink 和 readlinkat 读取
更改文件的访问和修改时间
执行函数所要求的优先权取决于 times 参数的值
mkdir、mkdirat 创建目录,rmdir 删除目录
对某个目录具有访问权限的任一用户都可以读该目录,只有内核才能写目录。一个目录的写权限位和执行权限位决定了在该目录中能否创建新文件以及删除文件,不表示能否写目录本身
目录实际格式依赖于 UNIX 系统实现和文件系统的设计
每个进程都有一个当前工作目录,是进程的一个属性,起始目录则是登录名的一个属性
进程调用 chdir 或 fchdir 可以更改当前工作目录
getcwd 取得当前工作目录
两个宏 major、minor 访问主、次设备号
第三章中打开一个文件时,返回一个文件描述符用于后续的 I/O 操作。而对于标准 I/O 库,它们的操作是围绕流进行的。当用标准 I/O 库打开或创建一个文件时,已使一个流与一个文件相关联
对于 ASCII 字符集,一个字符用一个字节表示。对于国际字符集,一个字符可用多个字节表示。
流的定向决定了所读、写的字符是单字节还是多字节的。
当一个流最初被创建时,它并没有定向。若在未定向的流上使用一个多字节 I/O 函数,则将该流的定向设置为宽定向的,使用一个单字节 I/O 函数,则设为字节定向的。
只有两个函数可改变流的定向:freopen 清除一个流的定向,fwide 设置流的定向。
注意:fwide 不改变已定向流的定向,无出错返回。
当打开一个流时,标准 I/O 函数 fopen 返回一个指向 FILE 对象的指针
对一个进程预定义了 3 个流,且这三个流可以自动地被进程使用,通过预定义文件指针 stdin、stdout、stderr 加以引用
标准错误流 stderr 通常是不带缓冲的,使得出错信息可以尽快显示出来
ISO C 要求:
很多系统默认:
不喜欢系统默认,可以调用下列函数更改缓冲类型
mode: _IOFBF 全缓冲、_IOLBF 行缓冲、_IONBF 不带缓冲
不带缓冲的流忽略 buf 和 size 参数。全缓冲或行缓冲,则 buf 和 size 可选择地指定一个缓冲区及其长度。该流带缓冲,而 buf 是 null,则标准 I/O 库将自动地为该流分配适当长度的缓冲区,通常是由常量 BUFSIZ 所指定的值
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.