头文件
- <fcntl.h> 文件控制
- <unistd.h> 符号常量
- <sys/stat.h> 文件状态
- <sys/types.h> 基本系统数据类型
- <utime.h> 文件时间
- <dirent.h> 目录项
open
头文件:#include <fcntl.h>
#include <sys/stat.h> // 提供open()函数的符号
#include <sys/types.h> // 提供mode_t类型
open( const char * pathname,int flags, mode_t mode)
参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标:
- O_RDONLY 以只读方式打开文件
- O_WRONLY 以只写方式打开文件
- O_RDWR 以可读写方式打开文件。
上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。
- O_CREAT 若欲打开的文件不存在则自动建立该文件。
- O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。
- O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
- O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的 资料也会消失。
- O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
- O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。
- O_NDELAY 同O_NONBLOCK。
- O_SYNC 以同步的方式打开文件。
- O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。
- O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败
参数mode 组合
- S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
- S_IRUSR 或S_IREAD, 00400权限,代表该文件所有者具有可读取的权限。
- S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。
- S_IXUSR 或S_IEXEC, 00100 权限,代表该文件所有者具有可执行的权限。
- S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
- S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
- S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
- S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
- S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
- S_IROTH 00004 权限,代表其他用户具有可读的权限
- S_IWOTH 00002权限,代表其他用户具有可写入的权限。
- S_IXOTH 00001 权限,代表其他用户具有可执行的权限。
返回值:若所有欲核查的权限都通过了检查则返回文件描述符,表示成功,只要有一个权限被禁止则返回-1。
错误代码
- EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。
- EACCESS 参数pathname所指的文件不符合所要求测试的权限。
- EROFS 欲测试写入权限的文件存在于只读文件系统内。
- EFAULT 参数pathname指针超出可存取内存空间。
- EINVAL 参数mode 不正确。
- ENAMETOOLONG 参数pathname太长。
- ENOTDIR 参数pathname不是目录。
- ENOMEM 核心内存不足。
- ELOOP 参数pathname有过多符号连接问题。
- EIO I/O 存取错误。
read
头文件:#include<unistd.h>
read(int handle,void *buf,int len);
- int handle 为要读取的文件
- void *buf 为要将读取的内容保存的缓冲区
- int len 读取文件的长度
返回值:返回实际读取的字节数,若出错,返回-1。
write
头文件:#include<unistd.h>
write(int handle,void *buf,int len);
- int handle 为要获取文件指针的文件句柄
- void *buf 为要写入的内容
- int len 为要写入文件的长度
返回值:若成功返回已写的字节数,若出错,返回-1。
lseek
头文件:#include <unistd.h>
lseek(int filedes, off_t offset, int whence);
- int filedes 为要获取文件指针的文件句柄
- off_t offset 为偏移量
- nt whence 为偏移位置
- SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算)
- SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处, offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移
- SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负,如果是正数表示往后偏移、如果是负数则表示往前偏移
返回值:新的偏移量(成功),-1(失败)
close
头文件:#include <unistd.h>
返回值:关闭成功返回0,失败则返回-1.
creat
头文件:
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
int creat(const char * pathname, mode_tmode)
- pathname 为指向欲建立的文件路径字符串
- mode_tmode 为创建模式,指定用户操作权限
- S_IRUSR 可读,1
- S_IWUSR 可写,2
- S_IXUSR 可执行,4
- S_IRWXR 可读、写、执行)7(也可以用数字代替,如0777)
Creat()相当于使用下列的调用方式调用open()
open(const char * pathname, (O_CREAT | O_WRONLY | O_TRUNC));
错误提示:
- EEXIST参数:pathname 所指的文件已存在.
- EACCESS参数:pathname 所指定的文件不符合所要求测试的权限
- EROFS:欲打开写入权限的文件存在于只读文件系统内
- EFAULT参数:pathname 指针超出可存取的内存空间
- EINVAL参数:mode 不正确.
- ENAMETOOLONG参数:pathname 太长.
- ENOTDIR 参数:pathname 为一目录
- ENOMEM :核心内存不足
- ELOOP 参数:pathname 有过多符号连接问题.
- EMFILE:已达到进程可同时打开的文件数上限
- ENFILE:已达到系统可同时打开的文件数上限
返回值:creat()会返回新的文件描述词, 若有错误发生则会返回-1, 并把错误代码设给errno.
stat
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char * file_name, struct stat *buf)
- file_name 为文件名
- struct stat 的结构体类型
stat结构体:
struct stat
{
dev_t st_dev; /* ID of device containing file */文件使用的设备号
ino_t st_ino; /* inode number */ 索引节点号
mode_t st_mode; /* protection */ 文件对应的模式,文件,目录等
nlink_t st_nlink; /* number of hard links */ 文件的硬连接数
uid_t st_uid; /* user ID of owner */ 所有者用户识别号
gid_t st_gid; /* group ID of owner */ 组识别号
dev_t st_rdev; /* device ID (if special file) */ 设备文件的设备号
off_t st_size; /* total size, in bytes */ 以字节为单位的文件容量
blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小
blkcnt_t st_blocks; /* number of 512B blocks allocated */ 该文件所占的磁盘块
time_t st_atime; /* time of last access */ 最后一次访问该文件的时间
time_t st_mtime; /* time of last modification */ /最后一次修改该文件的时间
time_t st_ctime; /* time of last status change */ 最后一次改变该文件状态的时间
};
stat结构体中的st_mode 则定义了下列数种情况:
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 套接字
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
上述的文件类型在POSIX中定义了检查这些类型的宏定义:
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode) 是否为目录
S_ISCHR (st_mode) 是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为socket
若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名,在linux中,最典型的就是这个/tmp目录啦。
st_mode 主要包含了 3 部分信息:
15-12 位保存文件类型
11-9 位保存执行文件时设置的信息
8-0 位保存文件访问权限
mkdir
头文件:#include <direct.h>
int mkdir(const char *path,mode_t mode);
- path 为创建目录的路径
- mode 为新创建目录的权限
mode方式:
S_IRWXU | 00700权限,代表该文件所有者拥有读,写和执行操作的权限 |
S_IRUSR(S_IREAD) | 00400权限,代表该文件所有者拥有可读的权限 |
S_IWUSR(S_IWRITE) | 00200权限,代表该文件所有者拥有可写的权限 |
S_IXUSR(S_IEXEC) | 00100权限,代表该文件所有者拥有执行的权限 |
S_IRWXG | 00070权限,代表该文件用户组拥有读,写和执行操作的权限 |
S_IRGRP | 00040权限,代表该文件用户组拥有可读的权限 |
S_IWGRP | 00020权限,代表该文件用户组拥有可写的权限 |
S_IXGRP | 00010权限,代表该文件用户组拥有执行的权限 |
S_IRWXO | 00007权限,代表其他用户拥有读,写和执行操作的权限 |
S_IROTH | 00004权限,代表其他用户拥有可读的权限 |
S_IWOTH | 00002权限,代表其他用户拥有可写的权限 |
S_IXOTH | 00001权限,代表其他用户拥有执行的权限 |
返回值: 若目录创建成功,则返回0;否则返回-1,并将错误记录到全局变量errno中。
opendir
头文件:
#include <sys/types.h>
#include <dirent.h>
DIR* opendir(const char* name);
- name 为打开目录的目录名
DIR结构体:
struct __dirstream
{
void *__fd; /* `struct hurd_fd' pointer for descriptor. */
char *__data; /* Directory block. */
int __entry_data; /* Entry number `__data' corresponds to. */
char *__ptr; /* Current pointer into the block. */
int __entry_ptr; /* Entry number `__ptr' corresponds to. */
size_t __allocation; /* Space allocated for the block. */
size_t __size; /* Total valid data in the block. */
__libc_lock_define (, __lock) /* Mutex lock for this structure. */
};
typedef struct __dirstream DIR;
返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL.
readdir
struct dirent
{
long d_ino; /* inode number 索引节点号 */
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
unsigned short d_reclen; /* length of this d_name 文件名长 */
unsigned char d_type; /* the type of d_name 文件类型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}
fork
头文件:#include <unistd.h>
pid_t pid;
pid = fork();
返回值:
- 0:子进程的返回值
- >0:父进程,返回子进程的id号
- <0:创建进程失败
wait
头函数:#include <wait.h> #include <sys/wait.h>
#incldue <sys/types.h>(提供类型pid_t的定义)
wait();
返回值:
成功返回:回收子进程的id号;
失败返回:-1;
pipe
头函数:#include <unistd.h>
exit
exit(0):正常运行程序并退出程序。
exit(1):非正常运行导致退出程序;
time
localtime
pthread_create
头函数:#include <pyhread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,const pthread_attr_t *attr,void *arg);
res = pthread_create(&myThread1, NULL, ThreadFun, NULL);
- pthread_t *thread:传递一个 pthread_t 类型的指针变量,也可以直接传递某个 pthread_t 类型变量的地址。pthread_t 是一种用于表示线程的数据类型,每一个 pthread_t 类型的变量都可以表示一个线程。
- const pthread_attr_t *attr:用于手动设置新建线程的属性,例如线程的调用策略、线程所能使用的栈内存的大小等。大部分场景中,我们都不需要手动修改线程的属性,将 attr 参数赋值为 NULL,pthread_create() 函数会采用系统默认的属性值创建线程。
- void *(*start_routine) (void ):以函数指针的方式指明新建线程需要执行的函数,该函数的参数最多有 1 个(可以省略不写),形参和返回值的类型都必须为 void * 类型。void 类型又称空指针类型,表明指针所指数据的类型是未知的。使用此类型指针时,我们通常需要先对其进行强制类型转换,然后才能正常访问指针指向的数据。
- void *arg:指定传递给 start_routine 函数的实参,当不需要传递任何数据时,将 arg 赋值为 NULL 即可。
返回值:如果成功创建线程,pthread_create() 函数返回数字 0,反之返回非零值。各个非零值都对应着不同的宏,指明创建失败的原因,常见的宏有以下几种:
- EAGAIN:系统资源不足,无法提供创建线程所需的资源。
- EINVAL:传递给 pthread_create() 函数的 attr 参数无效。
- EPERM:传递给 pthread_create() 函数的 attr 参数中,某些属性的设置为非法操作,程序没有相关的设置权限。
以上这些宏都声明在 <errno.h> 头文件中,如果程序中想使用这些宏,需提前引入此头文件。
pthread_join
#include <pthread.h>
int pthread_join(pthread_t thread, void ** retval);
pthread_exit
#include <pthread.h>
void pthread_exit(void *retval);
sleep
头文件:#include <unistd.h>
编辑命令
- Ctrl + a :移到命令行首
- Ctrl + e :移到命令行尾
- Ctrl + f :按字符前移(右向)
- Ctrl + b :按字符后移(左向)
- Alt + f :按单词前移(右向)
- Alt + b :按单词后移(左向)
- Ctrl + xx:在命令行首和光标之间移动
- Ctrl + u :从光标处删除至命令行首
- Ctrl + k :从光标处删除至命令行尾
- Ctrl + w :从光标处删除至字首
- Alt + d :从光标处删除至字尾
- Ctrl + d :删除光标处的字符
- Ctrl + h :删除光标前的字符
- Ctrl + y :粘贴至光标后
- Alt + c :从光标处更改为首字母大写的单词
- Alt + u :从光标处更改为全部大写的单词
- Alt + l :从光标处更改为全部小写的单词
- Ctrl + t :交换光标处和之前的字符
- Alt + t :交换光标处和之前的单词
- Alt + Backspace:与 Ctrl + w
相同类似,分隔符有些差别 [感谢 rezilla 指正]
重新执行命令
- Ctrl + r:逆向搜索命令历史
- Ctrl + g:从历史搜索模式退出
- Ctrl + p:历史中的上一条命令
- Ctrl + n:历史中的下一条命令
- Alt + .:使用上一条命令的最后一个参数
控制命令
- Ctrl + l:清屏
- Ctrl + o:执行当前命令,并选择上一条命令
- Ctrl + s:阻止屏幕输出
- Ctrl + q:允许屏幕输出
- Ctrl + c:终止命令
- Ctrl + z:挂起命令
Bang (!) 命令
- !!:执行上一条命令
- !blah:执行最近的以 blah 开头的命令,如 !ls
- !blah:p:仅打印输出,而不执行
- !$:上一条命令的最后一个参数,与 Alt + . 相同
- !$:p:打印输出 !$ 的内容
- !*:上一条命令的所有参数
- !:p:打印输出 ! 的内容
- ^blah:删除上一条命令中的 blah
- ^blah^foo:将上一条命令中的 blah 替换为 foo
- ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo