创建守护进程

前言

会话是用来管理前后台进程组,会话关联着一个终端,当我们关闭终端之后,会话也会随之被关闭,那么进程组里面管理的进程也会随之被关闭。
举例说明:当你用终端启动一个进程后,关闭终端,那么你运行的命令那个线程也会被关闭

我们不想我们启动的线程受到终端的影响,就算终端被关闭,也可以在后台运行,我们可以用创建守护进程的方法做到。

创建守护进程

1.创建一个子进程,父进程直接退出

方法:通过fork()函数

2.创建一个新会话,摆脱终端的影响

方法:通过setsid()函数

3.改变守护进程的当前工作目录,改为'/'

方法:通过chdir()函数

4.重设文件权限掩码

方法:通过umask()函数

5.关闭不需要的文件描述符
0,1,2 分别对应标准输入、标准输出、标准错误,默认被打开。我们并不希望守护进程和终端有任何关联,所以要关掉。

方法:调用close()函数

代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/stat.h>


#define maxfile  3

int main()
{
	pid_t pid;
	int fd,len,i,num,times = 100;
	char *buf = "this is dameon\n";

	len = strlen(buf) + 1;
	/*1.创建子进程,销毁父进程*/
	pid = fork();
	if(pid < 0)
	{
		printf("fork is failed\n");
		exit(1);
	}

	if(pid > 0)
	{
		exit(0);
	}
       /*2.创建新会话,摆脱终端的影响 */
	setsid();

	/*3.改变当前工作目录*/
	chdir("/");

	/*4.重设文件权限掩码*/
	umask(0);

	/*5.关闭默认文件描述符*/
	for(i = 0; i<maxfile;i++)
	{
		close(i);
	}
	/*6.实现守护进程的功能*/

	while(times)
	{
		fd = open("/tang.txt",O_CREAT| O_WRONLY |O_APPEND ,0666);
		write(fd,buf,len);
		close(fd);
		sleep(10);
		times = times -10;
	}
}

可以使用以下命令查看特定的任务状态

ps axjf | grep  "lalala"

其中 lalala为进程名称

nohub命令

将普通进程伪装成守护进程,用法简单:
命令:nohub kkk para
kkk :为进程名称
para :为进程输入的参数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值