1. 文件管理
1.1 open函数:打开文件
int open(const char *pathname,int flags,mode_t mode);
- 返回值:open成功返回文件描述符,失败返回-1
- filename:要打开的文件名
- flags:打开的方式
- mode:若以创建的方式打开,用mode设置文件的权限
1.2 close函数:关闭文件
int close(int fd);
- 返回值:0代表关闭成功,-1产生错误
- fd:文件描述符
1.3 read函数:从文件中读取
ssize_t read(int fd, void *buf, size_t count);
- 返回值:
- -1:读文件失败
- 0:文件已被读完
- 正数:读取的字节数
- fd:文件描述符
- buf:缓冲区,传出参数,用于存放读取的数据
- count:读取时指定要读取的字节数
1.4 write函数:向文件中写入
ssize_t write(int fd, const void *buf, size_t count);
- 返回值:写失败的时候返回-1。 写成功返回写入的字节数
- fd:文件描述符
- buf:缓存区,传入参数,提供要写入的数据
- count:指定要写入的字节数。
1.5 lseek函数:移动文件指针
off_t lseek(int fd, off_t offset, int whence);
- 返回值
- 返回-1表示出错
- 成功则返回相对文件开始的偏移量
- fd:文件描述符
- offset:偏移量
- whence:偏移量相对于什么开始的
1.6 stat函数:查看文件状态
int stat(const char *pathname, struct stat *statbuf);
- 返回值:操作是否成功
- pathname:查看哪个文件的状态
- statbuf:传出参数,封装状态结果
2. 进程管理
2.1 fork函数:创建子进程
pid_t fork(void);
- 返回值
- 子进程中,返回值值为0
- 父进程中,创建子进程成功则返回子进程pid;创建线程失败则返回-1
2.2 waitpid函数:等待子进程终止
// 回收任意子进程
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
- 返回值:-1表示出错,其他情况表示返回的子进程pid
- wstatus:传出参数,接收子进程退出的状态信息。
- pid:
- <-1 回收指定进程组内的任意子进程
- -1 回收任意子进程(相当于wait)
- 0 回收和当前调用waitpid进程一个组的所有子进程
- >0 回收指定id的子进程
- options:可以用来指定以非阻塞方式运行
- 非阻塞方式执行,直接返回系统调用结果。
- 如果没有子进程结束,返回值为0
- 如果有子进程结束,返回值为子进程的id
- 非阻塞方式执行,直接返回系统调用结果。
2.3 exec函数族:替换一个进程的核心映像
- l(list): 命令行参数列表
- p(path): 搜索文件时使用PATH环境变量
- v(vector):使用命名行参数数组
- e(environment):使用环境变量数组,不适用进程原有的环境变量。设置新加载程序运行的环境变量
// l代表list,p代表path
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
// 示例
execlp("ls","ls","-l","-F",NULL);
// 没有使用path环境变量,所以pathname需要指明绝对路径
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
//示例
execl("/bin/ls","ls","-l","-F",NULL);
// p代表使用系统的PATH环境变量
int execvp(const char *file, char *const argv[]);
// e代表使用自己定义的环境变量数组
int execve(const char *file, char *const argv[], char *const envp[]);
- 变参需要以NULL结尾。
- 返回值:只有在失败会返回-1,成功的话啥都不返回。因为整个代码都被替换了。
- argv:参数数组
- envp:环境变量数组
int main(){
if fd;
// 打开已经存在的文件
fd=open("hello.txt",O_RDWR);
// 如果打开失败
if(fd==-1){
// 输出失败原因
perror("open file");
exit(1);
}
// 将标准输出替换为指定文件
dup2(fd,STDOUT_FILENO);
// 如果这个成功,后面的代码就不走了,因为代码被替换了。
execlp("ps","ps","ax",NULL);
// 只有上一步执行发生错误,才会执行下面的逻辑
perror("exec error");
exit(1);
return 0;
}
2.4 exit函数:终止进程被返回状态
void _exit(int status);
2.5 kill函数:发信号给进程
int kill(pid_t pid, int sig);
2.6 getpid函数:获取当前进程的id
pid_t getpid(void);
2.7 getppid函数:获取当前进程的父进程id
pid_t getppid(void);
2.8 getuid函数:获取当前进程的实际用户
uid_t getuid(void);
2.9 getgid函数:获取当前进程的用户组id
gid_t getgid(void);
3. 文件和目录管理
3.1 mkdir函数:创建目录
int mkdir(const char *pathname, mode_t mode);
- 返回值:是否成功
- pathname:目录名
- mode:目录的权限
3.2 rmdir函数:删除空目录
int rmdir(const char *pathname);
3.3 chdir函数:改变工作目录
int chdir(const char *path);
3.4 chmod函数:修改文件保护位
int chmod(const char *pathname, mode_t mode);
3.5 link函数:创建一个硬链接
int unlink(const char *oldpath,const char *newpath)
3.6 unlink函数:删除一个链接
int unlink(const char *pathname);
- 如果是符号连接,删除符号连接
- 如果是硬链接,硬链接数减一。减到0时,释放数据块和inode
- 注意:如果文件硬链接数为0,但有进程已打开该文件,并持有文件描述符,则等待进程关闭文件时,kernel才真正去删除该文件。
补充:目录(文件)项的组成
- denty:目录项
- 文件名
- inode编号(对应一个inode结构体)
- 存储指针地址(从而找到文件的磁盘位置)
- 大小
- 权限
- 类型
- 所有者
3.7 truncate函数:修改文件为指定大小
- 将参数path指定的文件大小改为参数length指定的大小。如果原来的文件比参数length大,则截断。如果原来的文件比参数length小,则增加。
int truncate(const char *path, off_t length);
- 返回值:是否成功
- path:文件路径
- length:指定的文件大小
4. 环境变量
4.1 getenv函数:获取环境变量的值
char *getenv(const char *name);
- 返回值
- 成功时返回环境变量的值
- 失败时返回NULL
4.2 setenv函数:设置环境变量的值
int setenv(const char *name, const char *value, int overwrite);
- 返回值:值为0表示成功,值为-1表示失败
- overwrite:
- 1:覆盖原来环境变量
- 0:不覆盖
4.3 unsetenv函数:删除环境变量
int unsetenv(const char *name);
- 返回值:
- 0:删除成功
- -1:删除失败
5. 文件描述符的复制
5.1 dup2函数
// 用文件描述符oldfd的值去覆盖文件描述符newfd的值。最后返回文件描述符newfd
int dup2(int oldfd, int newfd);
- 返回值:
- 返回值被覆盖的文件描述符
- 用文件描述符oldfd的值去覆盖文件描述符newfd的值。最后返回文件描述符newfd
- 可以实现原本输出到终端变成输出到指定文件中。