进程的创建

来源:互联网 发布:java定义泛型变量 编辑:程序博客网 时间:2024/06/05 19:12
#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命令,该函数会给系统带来安全隐患

“`