创建子进程函数----fork( )
pid_t fork(void);
//pid_t:子进程号
创建形式一般为:
int main()
{
pid_t pid;
pid = fork();
//其中返回pid<0,则子进程创建失败。
if(pid == 0)
{
//子进程代码;
}
else
{
//父进程代码;
}
}
另外在进程中可以用函数返回进程号:
pid_t getpid(void) ;//返回当前执行进程的pid
pid_t getppid(void);//返回当前执行进程的父进程的pid
结束当前进程---- exit( ) / _exit( )
void exit(int status);
//等价于main中的return xxx;会刷新缓冲区
void _exit(int status);
//区别: exit会在结束进程,把所有文件的媛冲区刷新,
// _exit结束就是直接结束,不会刷新缓冲区
等待进程函数----wait( ) / waitpid( )
pid_t wait(int owstatus);
//等待任意进程结束,然后回收该进程的资源
pid_t waitpid(pid_t pid,int *wstatus, int options);
//等待任意/指定的某个子进程
//参数1:进程号
//参数2:进程结束时的状态存储的地址
//参数3:选项
WNOHANG //非阻塞等待,执行到这个函数时,有进程结束就回收,没有就结束函数,继续执行该语句之下的代码
0 //阻塞等待,一直等待某个进程结束
守护进程
/*创建步骤:
1.创建子进程,父进程退出
2.在子进程中创建新会话,子进程变为会话组组长
3.修改进程工作路径
4.修改文件权限隐码
5.关闭文件描述符
*/
int main()
{
if(fork() > 0) exit(0); //1.创建子进程,父进程退出
pid_t pid = setsid(); //2.在子进程中创建新会话,子进程变为会话组组长
chdir("/home/ubuntu"); //3.修改进程工作路径
umask(0); //4.修改文件权限隐码
//5.关闭文件描述符
int fds = getdtablesize();
for(int i = 0;i < fds;i++)
{
close(i);
}
//守护进程执行的内容
}
主函数main
int main(int argc,char * argv[])
//参数:argc:存储命令行参数个数
//参数:argv:存储每个命令行参数字符串的首地址
exec函数族
exec函数族:就是把当前进程执行的代码,替换成其他程序代码,在当前进程中就执行新程序的代码内容
execl( )
int execl(const char *pathname,const char arg,/* (char t) NULL*/);
//参数1:程序的路径名
//参数2:程序名以及给程序的参数
execlp( )
int execlp(const char *file,const char targ, .../* (char *] NULL */)
//参数:程序名以及程序的路经
//这个函数已经指定了一个路径,所以不需要程序的路径名
execv( )
int execv(const char *pathname, char *const argv[]);
//参数1:程序的路径名
//参数2:程序名以及给程序的参数,参数存在一个指针数组中
execvp( )
int execvp(char *const argv[])
//参数:程序名以及给程序的参数,参数存在一个指针数组中