Linux后台进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux后台进程相关的知识,希望对你有一定的参考价值。
参考技术A 引入的原因: 用于控制向多个进程进行信号的分发,发给一个进程组是信号会发生给进程组中每一个进程会话是一个或者多个进程组的集合,进程调用 setsid 函数建立一个会话。
进程调用setsid函数建立一个新的会话,会发生下面几件事
守护进程是生存期长的一种进程,没有控制终端。他们常常在系统引导装入时启动,系统关闭是终止。守护进程程序通常以字母 d 结尾。
用户层的守护进程的父进程是 init 进程。内核的守护进程并非init进程。
以 & 方式运行的为后台进程
比如: ping www.baidu.com &
通过 jobs 命令查看
将后台程序放到前台
通过 control+c 命名发送’hupinit‘信号kill掉进程
终端被挂断或者用户注销,SIGHUP信号会被发送到该终端相关的控制程序,而SIGHUP的默认行为是终止程序的运行。
需要实现终端退出后进程依然在后台运行,有两种途径
如果setid函数的进程就是一个进程组的组长,则函数会返回出错。为了解决这样情况,通常函数需要先fork,然后父进程退出,由子进程执行setsid。由于子进程继承的是父进程的进程组ID,而其PID是新分配的ID,因此这两者不可能相等,即子进程不可能是进程组的组长。 这种情况下,由于父进程先于子进程退出,因此子进程的父进程会有init进程接管。 而这就是sid命令的实现原理。
设置 setsid www.baidu.com
我们对比下和nohup
我们可以看到setsid的父进程变成了init进程。由于会话和父进程和shell无关了,因此无论如何shell都无法向该进程发送SIGHUP命令
linux 后台进程
守护进程
1 定义
守护进程是脱离于终端并且在后台运行的进程.
2 创建守护进程步骤
1)创建子进程,父进程退出.
2)在子进程中创建新会话.(最重要的一步,使用系统函数setsid)
3)改变当前目录为根目录
4)重设文件权限掩码
5)关闭文件描述符
调用setsid有三个作用:
1)让进程摆脱原会话的控制
2)让进程摆脱原进程组的控制
3)让进程摆脱原控制终端的控制
示例程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAXFILE 65535
int main()
{
pid_t pc;
int i, fd, len;
char *buf = "this is a Daemon
";
len = strlen(buf);
pc = fork(); // first
if(pc < 0)
{
printf("error fork
");
exit(1);
}
else if(pc > 0)
{
exit(0);
}
setsid(); // second
chdir("/"); // third
umask(0); // fourth
for(i=0; i<MAXFILE; i++) // five
close(i);
while(1)
{
if((fd = open("/tmp/daemon.log", O_CREAT | O_WRONLY | O_APPEND, 0600)) < 0)
{
perror("open");
exit(1);
}
write(fd, buf, len+1);
close(fd);
sleep(10);
}
return 0;
}
以上是关于Linux后台进程的主要内容,如果未能解决你的问题,请参考以下文章