进程控制-------僵尸进程、守护进程

1、终止进程:
终止函数:exit()和_exit()
区别:
(1)exit在关闭进程时候会让缓冲区数据会自动写回并关闭未关闭的文件
(2)_exit 是直接清空缓冲区然后退出;
一般都用前者,就不详细说了;
正是由于父亲儿子进程的终止所以有了僵尸进程,守护进程(后台执行)

2、僵尸进程(子进程先终止):
就是子进程先于父进程退出,父进程还不采取任何措施来处理挂掉的子进程,从而形成了僵尸进程;
也可以说子进程运行直至其终止,虽然它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。
这时候只有当父进程调用wait来收集僵尸进程,才会清除僵尸进程(就算用kill 也是杀不死那个僵尸进程的)
说道kill,ps -ef可以在linux中查看进程(类似windows的ctrl+alt+delete查看进程)
ps -ef|grep a.out :直接查看你需要的进程;
僵尸代码:

int main()
 {
     pid_t pid = fork();

     switch(pid)
     {
         case -1:
         return -1;
         break;

         case 0:
         printf("我是子进程,我的id是:%d\n",getpid());
         printf("寻找父亲进程\n");
         exit(0);    //子进程死亡

         default:
         printf("我是父亲进程,我的id是:%d\n",getppid());
         while(1);  //给一个死循环,父进程一直在执行没有采取wait措施,从而形成僵尸进程;
         break;
     }
     return 0;
 }

3、父进程先退出
(1)概念:
若父进程比子进程先终止,则该父进程的所有子进程的父进程都改变为init进程。我们称这些进程由init进程领养。其执行顺序大致如下:在一个进程终止时,内核逐个检查所有活动进程,以判断它是否是正要终止的进程的子进程,如果是,则该进程的父进程ID就更改为1(init进程的ID);
有init领养的进程不会称为僵死进程,因为只要init的子进程终止,init就会调用一个wait函数取得其终止状态。这样也就防止了在系统中有很多僵死进程。
(2)应用:
创建一个子进程之后父进程直接退出,这样就算关掉终端,子进程还是跑在后台,利用这种方法创建后台程序;

(3)守护进程:

代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>



int Daemon()
 {
     //1.创建子进程关闭父进程;
     pid_t pid = fork();
     if(pid > 0)
     {
         exit(0);
     }

     else if(pid < 0)
     {
         return -1;
     }

     //2.umask
     umask(0);

     //3.setsid;
     if(setsid < 0)
     {
         return -1;
     }

     //4.改变当前工作目录
     if(chdir("/") < 0)
     {
         return -1;
     }

     //5.关闭标准输入,输出,错误
     close(STDIN_FILENO);
     close(STDOUT_FILENO);
     close(STDERR_FILENO);

     //6.重新定向;
     fopen("/dev/null","ab+");
     fopen("/dev/null","ab+");
     fopen("/dev/null","ab+");



 }

 int main1()
 {
     Daemon();
     while(1);
     return 0;
 }

(4)扩展:
还有一只中创建后台的方法就是可执行文件加上取地址符:./a.out & ,就可以后台运行程序,控制台返回到 终端界面,可以运行其他命令;也就是执行这个程序的同时,你的终端同时还能够做其他的事情,如果不加这个符号,那么你执行这个程序后,你的终端只能等这个程序执行完成才能够继续执行其他的操作 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值