僵尸进程:在子进程未退出的情况下,父进程退出,子进程被init进程接管,但是子进程将不会正常退出,退出后也不会被收回该进程的资源,所以这种情况应该被避免,否则数量多了以后系统资源将被消耗完.为了避免这种情况可以是用vfork函数进行子进程的派生,或者在父进程中使用一下函数来等待子进程的退出:
头文件<sys/types.h><sys/wait.h>
int wait(int *status);//暂停目前进程的执行,直到有信号来激活或者子进程执行结束
int waitpid(int pid,int *status,int options);
//等待pid代表的子进程的执行结束,pid = -1,相当于wait。等待任何子进程
---------------------------------------------------------------------------------------------------------
守护进程:一直在后台运行,父进程为init,和僵尸进程类似,不同的是守护进程多为服务进程,是需要一直提供服务所以不能退出.
守护进程的一般编写步骤:
- 脱离控制终端(父进程),使父进程为init
- 禁止进程重新打开控制终端
- 关闭文件描述符(从父进程继承了文件描述符,最好先进行关闭,避免不必要的系统资源的浪费)
- 更改工作目录(避免工作目录被卸载)
- 重设文件创建掩码(避免创建文件的时候权限和我们所需要权限不一致)
- int c = 0;
- int pid = fork();
- if(pid > 0){ //退出父进程,使其父进程为init
- exit(0);
- }
- if(pid < 0){ //子进程创建失败 退出
- exit(1);
- }
- for(;c < 101122;c++){ //关闭文件描述符
- close(c);
- }
- chdir("/"); //更改工作目录
- umask(0); //重新设置文件创建掩码
- while(1){//死循环让其一直在后台运行
- //编写该进程所需要做的工作
- }
时间: 2024-10-16 02:27:55