创建进程
pid_t fork(void);
功能: 创建一个子进程。
参数: 无。
返回值:
成功:在父进程空间返回子进程的PID,在子进程空间返回0; 失败: -1,没有子进程被创建。
结束进程
void exit(int status);
功能: 结束当前进程。
返回值:无,一旦调用永不返回。
参数:
int status, 用户期望带回的状态值,一般表示任务是否成功。
void _exit(int status) 同exit, 区别是_exit函数立即结束进程,不清理缓存。
获取进程状态/等待进程
pid_t wait(int *status);
功能:阻塞地等待一个进程结束,并获得其状态值。
返回值: 成功,返回结束的子进程ID; 失败, -1;
参数:
int *status, 进程状态的接收缓冲区。
waitpid(pid_t pid, int *status, int option);
功能: 等待子进程结束,并获得状态值。
返回值:失败,-1; 指定WNOHANG并且没有进程结束, 0; 成功, 结束的进程的ID。
参数:
1. pid_t pid, 指定等待的子进程。
2. int *status, 进程状态的接收缓冲区。
3. int option, 标志位选项,例如WNOHANG表示非阻塞方式获取子进程状态。
执行新程序
execlp
execvp
execl
execv
守护进程(精灵进程)
通常是一个后台进程,它可以脱离终端的控制,不受终端影响,从而在后台执行特殊任务。
创建守护进程的步骤:
1. 创建子进程,并且父进程结束。(保证新的子进程不是进程组组长,因为如果进程已经是某个进程组组长,将不能成功调用setsid)
2. 子进程调用setsid(), 创建新的会话组并使自己成为新的会话组长。
3. 关闭所有的文件描述符。(因为进程在创建过程中继承了来自于父进程的大量资源,为了保证新进程不受其影响,尽量释放这些不用的资源)
4. 重设文件权限掩码。(为了保证新的守护进程可以不受限制地新建任何权限的文件)
5. 更改工作路径到根。(当前进程占用工作路径会导致当前磁盘分区无法卸载)
最终权限 = 期望权限 & (~掩码)