![](https://s5-media.51cto.com/ost/pc/static/noavatar.gif)
回复
一个终端可以暂时理解为一个"会话"。一个"会话"包含了很多进程组,一个进程组可以包含很多进程。如下图
#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
#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;
}
这里通过调用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 ./non_exit
nohub ./non_exit
文章转载自公众号:汽车与基础软件