关闭终端时如何让进程不退出

看球不费电
发布于 2023-11-14 14:41
浏览
0收藏

一个终端可以暂时理解为一个"会话"。一个"会话"包含了很多进程组,一个进程组可以包含很多进程。如下图

关闭终端时如何让进程不退出-鸿蒙开发者社区

  • 正常可以被终端退出的程序

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char * const * argv)
{      
       printf("学习如果退出终端,进程不被终止\n");
       
       
       for(;;)
      {      
               sleep(1);
               printf("时间流失1s\n");
      }      
       
       
       printf("程序结束\n");
       return 0;
}

程序运行时可以通过ps -ef 查看进程。进程号10777

ps -ef | grep non_exit

关闭终端时如何让进程不退出-鸿蒙开发者社区

当终端关闭后,进程消失。

ps -ef | grep non_exit

关闭终端时如何让进程不退出-鸿蒙开发者社区

  • 拦截SIGHUP 信号

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char * const * argv)
{      
       printf("学习如果退出终端,进程不被终止\n");
       
     
 signal(SIGHUP,SIG_IGN);//SIG——IGN代表要忽略的信号。请求系统不要执行默认的动作。
   
       for(;;)
      {      
               sleep(1);
               printf("时间流失1s\n");
      }      
       
       
       printf("程序结束\n");
       return 0;
}
  • 在代码中通过setsid()来实现

这里通过调用fork()创建一个子进程,在子进程中调用setsid来实现。当没有关闭终端的时候,父子进程都在运行。关闭后,子进程独立运行,不会随着终端关闭而被终止掉。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char * const * argv)
{      
       printf("学习如果退出终端,进程不被终止\n");
       
     
pid_t pid;

pid = fork();//调用系统函数fork(0 创建一个子进程

sleep(2);

if(pid<0)
{
printf("fork error!\n");
}
if(pid ==0)
{
printf("children process start exe.\n");

setsid();
for(;;)
{
sleep(1);
printf("children process sleep 1s\n");
}
return 0;
}
if(pid >0)
{

 for(;;)
 {      
 sleep(1);
 printf("时间流失1s\n");
 }
return 0;
}
       
       printf("程序结束\n");
       return 0;
}
  • 在终端中通过setsid 来实现

这个就相对非常的简单。只需要在运行程序的时候 添加setsid 即可 如下

setsid ./non_exit


  • 在终端中通过nohub实现

nohub ./non_exit



文章转载自公众号:汽车与基础软件

分类
已于2023-11-14 14:41:29修改
收藏
回复
举报
回复
    相关推荐