新手如何写守护进程daemon
守护进程又称精灵进程----脱离终端
在你身后默默运行,脱离终端
守护进程由会话的领头进程来担任
守护进程创建的步骤
a)更改文件权限
b)创建子进程,让父进程直接退出
3)使用setid让子进程变成会话的领头进程
i.pid_t setsid(void);
ii.返回值:
4)忽略子进程退出的信号
i.Signal(SIGCHLD,SIG_IGN);
5)将工作目录改为根目录
i. int chdir(const char *path);
ii.参数:要更改的目录路径
iii.返回值:成功返回0 失败返回-1
6)重定向/dev/null
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
int my_daemon(void)
{
//第一步 更改文件权限
/*关于umask 可以man一下进行查询,对于进程来说,只需要了解
由于使用了fork()函数新建的子进程继承了父进程的文件权限掩码
这就给孩子进程使用文件带来了一定的影响。因此把权限掩码设置为0即
umask(0),可以增强该守护进程的灵活性。*/
umask(0);
//第二步,创建子进程,让父进程直接退出
pid_t pid=fork();
if(pid<0)
{
perror("[error]");
return -1;
}
else if(pid>0)
exit(0);
//第三步,使用setid让子进程变成会话的领头进程
/*关于*/
setsid();
//第四步,忽略子进程退出的信号
/*signal函数:
typedef void (*sighandler_t)(int);
*/
(void )signal(SIGCHLD,SIG_IGN);
//daemon(0,0);
//第五步,将工作目录改为根目录
chdir("/");
//第六步,重定向,把无关信息输入到/dev/null中
freopen("/dev/null","w+",stdin);
freopen("/dev/null","w+",stdout);
freopen("/dev/null","w+",stderr);
}
int main()
{
my_daemon();
FILE *fp=fopen ("/mnt/hgfs/gongxiang/file_io/txt.c ","w+");
time_t loc_time;
while(1)
{
loc_time=time(NULL);
fprintf(fp,"time:%s",ctime(&loc_time));
fflush(fp);
sleep(2);
}
return 0;
}
写完后在编译运行
然后输入ps ajx
就能看到守护程序正在运行
我要运行的文件是./1116
关闭需要输入kill 6038
如果不杀死
就会出现下次无法编译运行此文件
显示请求被拒绝ld returned 1 exit status