Operating System

  • Apple File System(APFS) replaces HFS+ https://en.wikipedia.org/wiki/AppleFileSystem

    • optimized for flash and solid-state drive storage, with a primary focus on encryption
    • APFS supports 64-bit inode numbers, supporting over 9 quintillion files on a single volume

exec 函数族共 6 个函数:

include <unistd.h>

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char path, const char *arg, ..., char \const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char path, char *const argv[], char \const envp[]);

区别:

  • 以 execv 开头的函数使用"char *argv[]"传递命令行参数,即命令参数存放在一个字符串数组中,传递给 exec 函数的只是这个字符串数组的指针;而 execl 开头的函数是将参数一一列出,并以一个 NULL 表示结束.
  • execle 和 execve 使用指定的环境变量去替代默认的环境变量。其他四个函数使用默认的环境变量。
  • execlp 和 execvp 不要求完整路径,会自动到环境变量 PATH 制定的目录里去寻找;其他四个函数必须给出完整路径。

几点说明:

  • 调用 fork 函数创建子进程后,子进程复制父进程的地址空间。子进程调用 exec 函数后,它完全被新的程序取代,之前的复制白费了。通过"写时拷贝(copy-on-write)"的方法可以避免这种浪费。或调用 vfork,它不将父进程地址空间完全复制给子进程,而是在子进程调用 exec 前让它运行在父进程的空间,且父进程阻塞。
  • fork 产生子进程时会指定一个新的 pid;调用 exec 时使用新程序完全代替子进程的代码段,数据段和堆栈,但只有 pid 不变
  • 其中只有 execve 是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。