在linux系统的控制台下敲击 ps -A命令 或者 ps -e命令我们可以看到当前系统的前后台进程,凡是最后一个字符为d的进程都为守护进程,例如smbd,vsftpd,maild,telnetd等等
守护进程是没有控制终端的,终端名称都为?,所有守护进程的父进程都是init进程
下面创造一个守护进程
例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unlstd.h>
#include <sys/wait.h>
#define MAXFILE 65535 //父进程中的最大文件描述符个数
int main()
{
pid_t pc; //进程id
int i,fd,len;
char *buf="this is a test\n";
len=strlen(buf); //得到buf的长度
pc=fork(); //创建子进程
if(pc>0) exit(0); //直接关闭父进程,使子进程失去父进程,从而让init接管无主进程,所以可以了解到,守护进程的父进程是init进程
//以下都在子进程中运行
setsid(); //脱离以前的会话组,脱离以前的进程组,切断控制终端,将子进程提升为进程组首进程
chdir("/"); //改变根目录,该目录我们可以自行定义
umask(0); //更改文件的读写权限,0表示开放所有权限
for(i=0;i<MAXFILE;i++) close(i); //关闭从父进程继承来的所有文件描述符,避免资源浪费
while(1)
{
if((fd=open("/tmp/test_dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))==-1)
//O_CREAT表示打开文件,但是如果文件不存在则创建文件
//O_WRONLY表示采用读写方式打开
//O_APPEND表示在文件的尾部追加的方式打开
//0600,为0000 0110 0000 0000 ,为文件类型为0 ,文件所有者可读可写不可运行,用户组与超级用户无权限,其他用户无权限
{
//创建或打开失败,出错处理
}
write(fd,buf,len+1); //向fd所指向的文件内部追加buf缓冲中的len+1(+1是因为字符串最后有个\0 字符)个字节的字符
close(fd); //关闭文件描述符
sleep(2); //系统休眠2秒
}
}
该进程的运行效果是每两秒向 /tmp/test_dameon.log 文件中追加一行"this is a test"字符串
守护进程可以用来用户自定义的监听各种服务,例如自己的web服务器等等