进程的创建

#include<unistd.h>
pid_t fork(void);

创建一新进程,如果成功创建子进程,总是返回0,子进程的数据不会影响父进程的数据,不过文件相关属性会有影响,例如子进程中修改文件偏移量,父进程中的也跟着变(父进程中用wait或者sleep函数使得子进程得以运行)

#include<unistd.h>
pid_t vfork(void);

创建一个新的子进程,该子进程是为立即执行exec(),成功总是返回0。相对与fork(),vfork()无需为子进程复制虚拟页或页表,相反子进程共享父进程的内存(将会影响父进程数据),在exec()或者_exit()之前,将暂停执行父进程,但是对文件描述符的操作不会影响父进程,而且子进程优先父进程获得cpu使用权,fork()则是父进程优。不过不推荐使用该函数,除非速度绝对重要


void _exit(int status); //status参数定义了进程的终止状态,父进程可调用wait()以获取该状态,0代表成功推出,非0代表异常退出,不刷新stdio缓冲区,不常用,一般用下面的exit()
int exit(int status);   //return n等同exit(n),刷新stdio缓冲区
int atexit(void(*func)(void));  //注册退出处理程序
int on_exit(void(*func)(int,void *),void *arg); //传递俩个参数给func(),提供给exit()的status参数和注册时供给on_exit()的一份arg参数拷贝。该函数可移植性差

#include<sys/wait.h>
pid_t wait(int *status);//等待调用进程的任一子进程终止,用status返回子进程的终止状态
pid_t waitpid(pid_t pid,int *status,int options);
//pid用来表示需要等待的具体子进程,如果pid大于0,表示等待进程为pid的子进程,等于0,等待与父进程同一进程组的所有子进程,小于-1,等待进程组标识符与pid绝对值相等的所有子进程,等于-1,等待任一子进程,options的值如下
WUNTRACED   除了返回终止子进程的信息外,还返回因信号而停止的子进程信息
WCONTINUED  返回那些因收到SIGCONT信号而恢复执行的已停止子进程的状态消息
WNOHANG     如果pid所指定的子进程并未发生状态改变,则立即返回,而不会阻塞

这里写图片描述

int waitid(idtype_t idtype,id_t id,siginfo_t *infop,int options);
若idtype为P_ALL,则等待任何子进程,同时忽略id的值
如果为P_PID则等待进程idid的子进程
如果为P_PGID,则等待进程组idid各进程的所有子进程
options的值可为
WEXITED 等待已终止的子进程,而无论其是否正常返回
WSTOPPED 等待已通过信号而停止的子进程
WCONTINUED 等待经由信号SIGCONT而回复的子进程
WNOHANG    如果匹配id值的子进程并无状态信息需要返回,则立即返回
WNOWAIT     执行成功,waitid()返回0,且会更新infop所指向的siginfo_t结构,以包含子进程的相关信息

//参数rusage所指向的结构中返回终止子进程的资源使用情况,包括cpu时间总量,内存管理统计数据
//如果options中指定了WUNTRACED 选项,则还可以获取到停止子进程的资源使用信息,一般也不怎么用这两个调用
#include<sys/resource.h>
#include<sys/wait.h>
pid_t wait3(int *status,int options,struct rusage *rusage);
pid_t wait4(pid_t pid,int *status,int options,struct rusage *rusage);

```
#include<unistd.h>
//丢弃旧程序,执行新程序,pathname新程序路径名
//argv命令行参数,argv[0]为命令名,argv[1]为第一个参数
//新程序的环境列表,对应新程序的environ数组
int execve(const char *pathname,char *const argv[],char *const envp[]);
int execlp("ls","ls","-l",argv[0],(char *)NULL);//在程序中使用,列出该程序的文件的详细信息,环境列表使用系统环境
int execl("/bin/sh","sh","-c","ls|wc",(char *)NULL);    //路径,命令名称,选项,命令内容

#include<stdlib.h>
int system(const char *command);    //执行任意的shell命令,该函数会给系统带来安全隐患

“`

原文地址:https://www.cnblogs.com/biaopei/p/7730609.html