父子进程:
1,Linux下创建进程的函数为fork();被创建的进程为子进程,发起创建的进程为父进程;他们共用所有资源.通过创建函数子进程函数fork的返回值区分;PID为0,为子进程,大于0为父进程.
2,子进程创建后,对于fork()的返回值,父进程返回子进程的PID,子进程返回0;通过getpid()可以获取当前进程pid,通过getppid()获取当前进程的父进程的pid.
3,通过vfork()也可创建子进程,与fork()不同的时,fork()是复制父进程的所有资源,vfork()是共享父进程的所有资源.fork()的父子进程随机运行;vfork的父子进程中,子进程优先运行,运行完后必须通过exit(0)退出,父进程才能继续运行,负责父子进程会被锁死.
exec函数族:
1,使用fork()创建的子进程,所有资源是复制父进程的;因此让程序运行另外一个程序,这里引进了exec函数族,除PID外替换掉旧的所有资源;这就可以产生一个完全不同与父进程的子进程.
2,exec函数族共有6个函数可使用,按传输参数类型可分为l和v;按是否传输路径信息为有p和无p;按是否配置新的环境变量为有e和无e.
守护进程:
1,守护进程是一类在后台工作的特殊进程,守护进程脱离终端运行,不受外部的因素的变化而变化.
2,创建守护进程是一个固定的流程:
(1).创建子进程,父进程退出
(2).在子进程中创建新会话,使用函数setsid();
(3).改变工作目录,使用函数chdir();
(4).重设文件权限掩码,使用函数umask();
(5).关闭文件描述符,使用函数getdtablesize();
进程函数:
fork():
vfork():
//头文件为 <sys/types.h> <unistd.h>
//无参数,返回值为PID
//fork 共用父进程的环境,随机运行;
//vfork 共用父进程地址空间,子进程优先运行;
getpid()
getppid():
//头文件为 <sys/types.h> <unistd.h>
//pid获取当前进程ID
//ppid获取当前进程的父进程ID
exit():
//头文件为 <stdlib.h>
//用于退出进程,通过输入不同参数,按不同状态退出.
_exit():
//头文件为 <unistd.h>
//无参数,直接使进程停止.
wait()
waitpid():
//头文件为 <sys/types.h> <wait.h>
//wait参数为指针,可以保存结束时的状态;用来回收子进程资源.
//waitpid 可以按参数pid输入值回收一个子进程资源.
//wait(NULL)等价于waitpid(-1,NULL,0)
exec函数族函数:
execl(path,list)
execlp(file,list)
execle(path,list,环境变量向量表)
execv(path,向量表)
execvp(file,向量表)
execve(path,向量表,环境变量向量表):
//头文件为 <unistd.h>
//l表示按顺序传参,每个成员按逗号分格,最后用NULL结尾;
//v表示按指针数组的方式传参,最后用NULL结尾;
//有p 形参为file,调用该函数,只需提供文件名,系统会按照环境变量$PATH内容自己搜索;
//无p 形参为path,在调用该程序时,需要提供完整的路径信息;
//有e 通过环境变量向量表传入当前进程的环境变量
//无e 使用系统环境变量
守护进程相关函数:
setsid():
//头文件为 <sys/types.h> <unistd.h>
//无参数,创建新会话
chdir():
//头文件为 <unistd.h>
//参数为改变的工作路径,
umask():
//头文件为 <sys.types.h> <stat.h>
//参数为设定的文件权限掩码,常用0;
getdtablesize():
//头文件为 <unistd.h>
//无参数,返回值为当前进程打开的文件描述符总数
mkdir():
//头文件为 <sys/stat.h>
//创建文件目录,并添加权限如mkdir(目录,0777);