/* 创建守护进程:
* 1、fork创建子进程 2、setsid()为子进程创建新会话
* 3、chdir("/")改变工作目录为根目录
* 4、umask(0)改变掩码 5、关闭所有打开的文件
* 6、while(1);保证程序一直在运行
*
* 运行时要加sudo命令
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
if ((pid = fork()) { exit(0); } //创建子进程,并结束父进程。这样子进程就成了孤儿进程,其父进程的ID变成了1(即root进程)
else if (pid < 0) { exit(-1); } //fork失败,退出
int fd, fdtablesize;
fdtablesize = getdtablesize();
for (fd=0; fd<fdtablesize; fd++) //关闭打开的文件描述符
close(fd);
time_t timet;
if ((fp = fopen("log.txt", "a+")) == NULL)
{
exit(-1);
}
while (1) //每隔一秒向根目录下的log.txt文件写时间
{
if (time(&timet) == -1)
{
exit(-1);
}
fprintf(fp, "%s\n", ctime(&timet));
fflush(fp);
sleep(1);
}
fclose(fp);
return 0;
}
* 1、fork创建子进程 2、setsid()为子进程创建新会话
* 3、chdir("/")改变工作目录为根目录
* 4、umask(0)改变掩码 5、关闭所有打开的文件
* 6、while(1);保证程序一直在运行
*
* 运行时要加sudo命令
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
if ((pid = fork()) { exit(0); } //创建子进程,并结束父进程。这样子进程就成了孤儿进程,其父进程的ID变成了1(即root进程)
else if (pid < 0) { exit(-1); } //fork失败,退出
setsid(); //第一个子进程成为新的会话组长和进程组长,并与控制终端分离
if ((pid = fork()) { exit(0); } //创建第二子进程,并结束第一子进程。这样第二子进程不再是会话组长
else if (pid < 0) { exit(-1); } //fork失败,退出
int fd, fdtablesize;
fdtablesize = getdtablesize();
for (fd=0; fd<fdtablesize; fd++) //关闭打开的文件描述符
close(fd);
chdir("/tmp"); //改变工作目录到/tmp
umask(0); //重设文件掩码
time_t timet;
if ((fp = fopen("log.txt", "a+")) == NULL)
{
exit(-1);
}
while (1) //每隔一秒向根目录下的log.txt文件写时间
{
if (time(&timet) == -1)
{
exit(-1);
}
fprintf(fp, "%s\n", ctime(&timet));
fflush(fp);
sleep(1);
}
fclose(fp);
return 0;
}